朋友们,hello呀,今天我们讲一下二叉树的遍历方法。
所谓二叉树,就是树形结构中比较特殊的一种,它满足每个节点的度最多为2,也就是最多有两个分叉,这两个分叉分别称为左子树和右子树(也称为该节点的两个孩子)。一般来说,左右子树具有严格的顺序性,绝对不能轻易颠倒位置。
二叉树分为空二叉树和非空二叉树,节点数为0的二叉树称为空二叉树,简称空树;否则为非空树,非空树有且仅有一个根节点。
二叉树节点的定义
typedef struct Binode {//定义二叉树节点
char data;
Binode* lkid, *rkid;
}*Node;
注意每个二叉树节点包括数据域和左右子树的指针域
二叉树的建立
下面我们以【前序输入创建二叉树】为例介绍二叉树的创建过程
因为每个二叉树节点的左右子树的指针域可能为NULL,为了显示出来,我们用字符‘#’表示
我们以下述二叉树为例讲解
右图就是我们将空指针域改为#表示的结果
前序遍历遍历顺序:根-左-右
中序遍历遍历顺序:左-根-右
后序遍历遍历顺序:左-右-根
有了上述规则,我们不难得出前序遍历该二叉树的拓展树的结果为AB#D##C##
我们有了如下代码:
void createBitree(Node&T)//按前序输入创建二叉树
{
char ch;
cin >> ch;
if (ch == '#')T = NULL;//如果为#,设置为空
else{
T = new Binode;
T->data = ch;//否则,字符存入数据域中
createBitree(T->lkid);//建立左子树
createBitree(T->rkid);//建立右子树
}
}
不难发现,二叉树的建立是依靠递归来完成的,而递归顺序与我们选择用哪种方式建立二叉树有关,比如,如果我们选择用中序方式建立二叉树,核心代码应改为:
createBitree(T->lkid);//建立左子树
T->data = ch;//字符存入数据域中
createBitree(T->rkid);//建立右子树
这和我们中序遍历[左-根-右]的顺序是完全一致的。
二叉树前中后序遍历
有了前面的基础,我们知道了遍历操作递归的顺序,那么遍历二叉树就不难了
以【前序遍历二叉树】为例,代码如下:
void preorder(Node &T)//前序遍历二叉树
{
if (!T)return;
cout << T->data;//输出节点信息,也可以是其他操作
preorder(T->lkid);//遍历左子树
preorder(T->rkid);//遍历右子树
}
很精简,是不是?这就是递归的好处。这里再插一嘴,为什么考虑用递归呢,其实,你想一下,二叉树就是按照递归方式定义的呀!好一个返璞归真!
二叉树定义如下:
二叉树(Binary Tree)是n(n≥0)个结点的有限集合,该集合或者为空集(空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。
整体代码如下:
#include <iostream>
using namespace std;
typedef struct Binode {//定义二叉树节点
char data;
Binode* lkid, *rkid;
}*Node;
void createBitree(Node&T)//按前序输入创建二叉树
{
char ch;
cin >> ch;
if (ch == '#')T = NULL;
else{
T = new Binode;
T->data = ch;
createBitree(T->lkid);
createBitree(T->rkid);
}
}
//AB#D##C##
void preorder(Node &T)//前序遍历二叉树
{
if (!T)return;
cout << T->data;
preorder(T->lkid);
preorder(T->rkid);
}
void inorder(Node& T)//中序遍历二叉树
{
if (!T)return;
inorder(T->lkid);
cout << T->data;
inorder(T->rkid);
}
void postorder(Node& T)//后序遍历二叉树
{
if (!T)return;
postorder(T->lkid);
postorder(T->rkid);
cout << T->data;
}
int main()
{
Binode* root =NULL;
createBitree(root);//创建二叉树
cout << "前序遍历:";
preorder(root);
cout << endl;
cout << "中序遍历:";
inorder(root);
cout << endl;
cout << "后序遍历:";
postorder(root);
cout << endl;
system("pause");
return 0;
}
输入及输出结果:
好了,今天的分享就到这里,感谢观看,如果喜欢,记得关注哦!