遍历一棵二叉树
遍历他!!!遍历他!!!
前序遍历序列:A B D G C E F
中序遍历序列:D G B A E C F
后序遍历序列:G D B E F C A
下面详细的解释三种递归遍历。
前序递归遍历
若二叉树为空,则空操作返回;
否则:①访问根结点;
②前序遍历根结点的左子树;
③前序遍历根结点的右子树。
void Pre(BiTree T)//递归方式前序遍历二叉树
{
if (T == NULL)
return;
show(T->data);// 根
Pre(T->lchild);//左
Pre(T->rchild);//右
}
中序递归遍历
若二叉树为空,则空操作返回;
否则:①中序遍历根结点的左子树;
②访问根结点;
③中序遍历根结点的右子树。
void InOrder(BiTree T)//递归方式中序遍历二叉树
{
if(T==NULL)
return;
InOrder(T->lchild);//左
show(T->data);//根
InOrder(T->rchild);//右
}
后序递归遍历
若二叉树为空,则空操作返回;
否则:①后序遍历根结点的左子树;
②后序遍历根结点的右子树。
③访问根结点;
void Post(BiTree T)//递归方式后序遍历二叉树
{
if(T==NULL)
return;
Post(T->lchild);//左
Post(T->rchild);//右
show(T->data);//根
}
完整代码
只要记住每种遍历的顺序,按顺序写递归,易懂易记,下附完整代码。
#include<bits/stdc++.h>
using namespace std;
typedef struct BiTNode//二叉树的存储结构
{
char data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
void Create(BiTree *T)
{
char ch;
cin >> ch;
if (ch == '#')
{
*T = NULL;
return ;
}
else
{
*T = new BiTNode;
(*T)->data = ch; //节点赋值
Create(&(*T)->lchild);//构造左子树
Create(&(*T)->rchild);//构造右子树
}
}
void show(char ch)
{
cout<<ch<<" ";
}
void Pre(BiTree T)//递归方式前序遍历二叉树
{
if (T == NULL)
return;
show(T->data);// 根
Pre(T->lchild);//左
Pre(T->rchild);//右
}
void InOrder(BiTree T)//递归方式中序遍历二叉树
{
if(T==NULL)
return;
InOrder(T->lchild);//左
show(T->data);//根
InOrder(T->rchild);//右
}
void Post(BiTree T)//递归方式后序遍历二叉树
{
if(T==NULL)
return;
Post(T->lchild);//左
Post(T->rchild);//右
show(T->data);//根
}
int main()
{
BiTree T = NULL;
cout<<"请以前序遍历的方式输入二叉树:"<<endl;
Create(&T);
cout<<"递归前序遍历输出为:"<<endl;
Pre(T);
cout<<endl;
cout<<"递归中序遍历输出为:" <<endl;
InOrder(T);
cout<<endl;
cout<<"递归后序遍历输出为:" <<endl;
Post(T);
cout<<endl;
return 0;
}