遍历二叉树
- 在二叉树的应用中,常常要求在树中查找具有某种特征的结点,或者对树中的结点逐一进行某种处理,这就出现了一个如何遍历二叉树的问题。
- 我们希望能按照某条搜索路径访问树中的每一个结点,并使得每个结点有且仅被访问一次。“访问”的含义很多,可以是对结点作各种处理,如输出结点的信息等。遍历对线性结构来说是一个容易解决的问题,而对于二叉树则不然,由于二叉树是一种非线性结构,它的每个结点都可能有0~2棵子树,因此需要寻求一种规律,使得二叉树上的结点能排列在线性队列上从而便于遍历。
- 这里若我们规定遍历时先左后右,则将只有三种情况,即根左右,左根右,左右根,我们依次称为先序遍历,中序遍历,后序遍历。
- 如下两图为两个例子,并给出了先序,中序,后序遍历的结果:
- 这里先序,中序,后序遍历我用的递归的方式去实现的,举中序为例,其核心代码即为:(左根右的思想)
void inOrder(BiTree& T)
{
if(T)
{
inOrder(T->lchild);
visit(T->data);
inOrder(T->rchild);
}
}
- 下面是遍历二叉树的完整实现代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
//二叉链表的结点结构
typedef struct BiTreeNode{
char data; //数据域
struct BiTreeNode* lchild; //左孩子指针域
struct BiTreeNode* rchild; //右孩子指针域
}BiNode,*BiTree;
void CreateBiTree(BiTree& T); //初始化添加二叉树信息
void preOrder(BiTree& T); //先序遍历二叉树:根 左 右
void inOrder(BiTree& T); //中序遍历二叉树:左 根 右
void postOrder(BiTree& T); //后序遍历二叉树:左 右 根
void CreateBiTree(BiTree& T)
{
char ch;
cin>>ch;
if(ch=='#') T=NULL;
else
{
if(!(T=(BiNode*)malloc(sizeof(BiNode)))) exit(0);
T->data=ch;
//这里注意正确输入的顺序
CreateBiTree(T->lchild); //先构造左子树
CreateBiTree(T->rchild); //再构造右子树
}
}
int visit(char data1)
{
cout<<data1;
return 0;
}
void preOrder(BiTree& T)
{
if(T)
{
visit(T->data);
preOrder(T->lchild);
preOrder(T->rchild);
}
}
void inOrder(BiTree& T)
{
if(T)
{
inOrder(T->lchild);
visit(T->data);
inOrder(T->rchild);
}
}
void postOrder(BiTree& T)
{
if(T)
{
postOrder(T->lchild);
postOrder(T->rchild);
visit(T->data);
}
}
int main()
{
//测试用例:
//ABE##F##C#DG###
//-+a##*b##-c##d##/e##f##
BiTree T;
CreateBiTree(T);
preOrder(T);
cout<<endl;
inOrder(T);
cout<<endl;
postOrder(T);
return 0;
}
运行结果如下: