二叉树的遍历
二叉树的遍历有三种方式:
- 前序遍历(DLR):先访问根结点,再先序遍历左子树,最后先序遍历右子树。
- 中序遍历(LDR):先访问左子树,再中序遍历根结点,最后中序遍历右子树。
- 后序遍历(LRD):先后序遍历左子树,再后序遍历右子树,最后访问根结点。
如图所示的二叉树,其先序遍历为:
A(先遍历根结点)BDE(再先序遍历左结点)FC(最后先序遍历右结点).
中序遍历为:
DBE(先中序遍历左结点)A(再遍历根节点)FC(最后中序遍历右结点)
后序遍历为:
DEB(先后序遍历左结点)CF(再后序遍历右结点)A(最后遍历根节点)
根据二叉树的遍历逆推二叉树
其基本方法是先序/后序遍历确定根,中序确定分布
eg1:先序遍历为:ABDGEHCF
中序遍历为:GDBHEACF
eg2:后序遍历为DCEGBFHKJIA
中序遍历为DCBGEAHFIJK
其结果为下图所示:
二叉树的创建与遍历
#include<bits/stdc++.h>
using namespace std;
struct node
{
char data;
struct node *lchild;//左子树
struct node *rchild;//右子树
};
//方便书写用typedef重新命名
typedef struct node BTNode;
typedef struct node* tree;
tree root=NULL;//创建一个根
void pre_crt(tree &bt)//按先序输入二叉树
{
char ch;
ch=getchar();
if(ch!='#')//用#代替空
{
bt=new node;//创造根结点
bt->data=ch;
pre_crt(bt->lchild);//创建左子树
pre_crt(bt->rchild);//创建右子树
}
else bt=NULL;
}
void DLR(tree bt)//先序遍历
{
if(bt==NULL)
return;
cout<<bt->data;
DLR(bt->lchild);
DLR(bt->rchild);
}
void LDR(tree bt)//中序遍历
{
if(bt==NULL)
return;
LDR(bt->lchild);
cout<<bt->data;
LDR(bt->rchild);
}
void LRD(tree bt)//后序遍历
{
if(bt==NULL)
return;
LRD(bt->lchild);
LRD(bt->rchild);
cout<<bt->data;
}
int main()
{
pre_crt(root);
DLR(root);
cout<<endl;
LDR(root);
cout<<endl;
LRD(root);
cout<<endl;
return 0;
}