首页 > 编程语言 >c++ 实现 二叉树的 先序遍历,中序遍历 ,后序遍历

c++ 实现 二叉树的 先序遍历,中序遍历 ,后序遍历

时间:2023-09-14 13:44:05浏览次数:47  
标签:遍历 TreeNode 中序 nullptr 二叉树 root 节点

遍历二叉树

跟数组不同,树是一种非线性的数据结构,是由n(n >=0)个节点组成的有限集合。如果n==0,树为空树。如果n>0,树有一个特定的节点,叫做根节点(root)。

 

对于树这种数据结构,使用最频繁的是二叉树。每个节点最多只有2个子节点的树,叫做二叉树。二叉树中,每个节点的子节点作为根的两个子树,一般叫做节点的左子树和右子树。

 

我们可以为树的节点定义一种结构体类型,而且为了方便以后在不同的文件中使用,还可以自定义一个头文件tree_node.h,将结构体TreeNode的定义放在里面:

#pragma once

#include<string>

using namespace std;

 

struct TreeNode

{

    string name;

    TreeNode* left;

    TreeNode* right;

};

在别的文件中,如果想要使用TreeNode这个结构体,我们只要引入就可以:

#include "TreeNode.h"

对于树的遍历,主要有这样三种方式:

l  先序遍历:先访问根节点,再访问左子树,最后访问右子树;

l  中序遍历:先访问左子树,再访问根节点,最后访问右子树;

l  后序遍历:先访问左子树,再访问右子树,最后访问根节点。

这种遍历方式就隐含了“递归”的思路:左右子树本身又是一棵树,同样需要按照对应的规则来遍历。

我们可以先单独创建一个文件print_tree.cpp,实现二叉树的遍历方法:

#include<iostream>

#include "tree_node.h"

 

// 先序遍历打印二叉树

void printTreePreOrder(TreeNode* root)

{

    // 基准情况,如果是空树,直接返回

    if (root == nullptr)    return;

 

    //cout << (*root).name << "\t";

    cout << root->name << "\t";

 

    // 递归打印左右子树

    printTreePreOrder(root->left);

    printTreePreOrder(root->right);

}

 

// 中序遍历打印二叉树

void printTreeInOrder(TreeNode* root)

{

    // 基准情况,如果是空树,直接返回

    if (root == nullptr)    return;

 

    printTreeInOrder(root->left);

    cout << root->name << "\t";

    printTreeInOrder(root->right);

}

 

// 后序遍历打印二叉树

void printTreePostOrder(TreeNode* root)

{

    // 基准情况,如果是空树,直接返回

    if (root == nullptr)    return;

 

    printTreePostOrder(root->left);

    printTreePostOrder(root->right);

    cout << root->name << "\t";

}

然后将这些函数的声明也放到头文件tree_node.h中:

void printTreePreOrder(TreeNode* root);

void printTreeInOrder(TreeNode* root);

void printTreePostOrder(TreeNode* root);

 

接下来就可以在代码中实现具体的功能了:

#include<iostream>

#include "tree_node.h"

 

int main()

{

    // 定义一棵二叉树

    TreeNode nodeG = {"G", nullptr, nullptr};

    TreeNode nodeF = { "F", nullptr, nullptr };

    TreeNode nodeE = { "E", &nodeG, nullptr };

    TreeNode nodeD = { "D", nullptr, nullptr };

    TreeNode nodeC = { "C", nullptr, &nodeF};

    TreeNode nodeB = { "B", &nodeD, &nodeE };

    TreeNode nodeA = { "A", &nodeB, &nodeC };

 

    TreeNode* tree = &nodeA;

 

    printTreePreOrder(tree);

 

    cout << endl << endl;

 

    printTreeInOrder(tree);

 

    cout << endl << endl;

 

    printTreePostOrder(tree);

 

    cin.get();

}

标签:遍历,TreeNode,中序,nullptr,二叉树,root,节点
From: https://www.cnblogs.com/huangzuhong/p/17702301.html

相关文章

  • 洛谷[P1305 新二叉树] Tag:二叉树、基础数据结构
    P1305新二叉树题目描述:输入一串二叉树,输出其前序遍历。输入格式:第一行为二叉树的节点数$n(1\len\le26)$,后面\(n\)行,每一个字母为节点,后两个字母分别为其左右儿子。特别地,数据保证第一行读入的节点必为根节点。空节点用*表示输出格式:二叉树的前序遍历。思路:对......
  • leetcode 二叉树的最大深度
    给定一个二叉树root,返回其最大深度。二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。示例1:输入:root=[3,9,20,null,null,15,7]输出:3示例2:输入:root=[1,null,2]输出:2解题思路这里可以转化思路为计算当前节点左子树的深度和右子树的深度......
  • 平衡二叉树(Balanced Binary Tree)
    平衡二叉树(BalancedBinaryTree)平衡二叉树是一种特殊的二叉搜索树,它具有以下特点:每个节点的左子树和右子树的高度差不超过1。所有的子树也都是平衡二叉树。通过保持平衡性,平衡二叉树可以在最坏情况下仍然具有较好的性能,保证查找、插入和删除操作的时间复杂度为O(logn)。......
  • leetcode450删除搜索二叉树的节点
    删除的二叉树节点分4种情况:叶子节点,直接删除就行左节点不为空,右节点为空;直接将左子树返回左节点为空,右节点不为空;直接将右子树返回左节点和右节点不为空;将右子树最小的节点作为根节点,返回右子树TreeNode*deleteNode(TreeNode*root,intkey){if(!root)returnn......
  • 二叉树 遍历 hdu-1710-Binary Tree Traversals
    给出二叉树的前序遍历和中序遍历,求后序遍历。。 算法:由前序遍历的第一个元素可确定左、右子树的根节点,参照中序遍历又可进一步确定子树的左、右子树元素。如此递归地参照两个遍历序列,最终构造出二叉树。 由前序和中序结果求后序遍历结果树的遍历: 给你一棵树的先......
  • 二叉树(binary tree)
    二叉树(binarytree)二叉树(BinaryTree)是一种常见的树状数据结构,它由一组节点组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树具有以下特点:每个节点最多有两个子节点,分别称为左子节点和右子节点。左子树和右子树也是二叉树,它们的结构与父节点类似。二叉树的顺......
  • delphi FireDAC 数据集快速遍历方式
    FireDAC数据集快速遍历方式代码遍历数据集procedureTForm1.Button1Click(Sender:TObject);varvTick:DWORD;I:Integer;vCount:Integer;begin//查询数据FDQuery1.Open('SELECT*FROMtceshi');//获取全部数据FDQuery1.FetchAll;//通过Next方法......
  • #yyds干货盘点# LeetCode程序员面试金典:翻转二叉树
    题目:给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]代码实现:classSolution{publicTreeNodeinvertTree(TreeNoderoot){......
  • 二叉树(顺序存储要维护关系)
                    ......
  • 二叉树的便利
         ......