我们先理解一下前中后序遍历,这是基础。
//前序遍历
void Tree::PreOrderTraverse(BiTree *T) {
if(!T) {
return ;
} else {
cout<<T->data<<" ";
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
//中序遍历
void Tree::InOrderTraverse(BiTree *T) {
if(!T) {
return ;
} else {
InOrderTraverse(T->lchild);
cout<<T->data<<" ";
InOrderTraverse(T->rchild);
}
}
//后序遍历
void Tree::LastOrderTraverse(BiTree *T) {
if(!T) {
return ;
} else {
LastOrderTraverse(T->lchild);
LastOrderTraverse(T->rchild);
cout<<T->data<<" ";
}
}
我们理解到以下几点:
- 前序遍历是从一个根节点左子树开始遍历,同时输出,当左子树为空,就遍历右子树,右子树不为空就输出
- 中序遍历是从一个根节点左子树开始遍历,直到它的左子树为空,就输出,然后输出此根节点,然后遍历右子树,同理输出
- 后序遍历也是从一个根节点左子树开始遍历,直到它的左右子树都为空,就输出,然后遍历右子树,同理输出,最后输出根节点
比如这个二叉树
我的分析方法是按照后序遍历的结果进行分块推算
举个例子
二叉树的中序遍历CBEFDGAJILKHNOMP
后序遍历CFEGDBJLKIONPMHA
请推算出整个二叉树
1.先看后序遍历结果,A是最后一位,所以A就是顶点,然后A前一位是H,所以H为A的右子树顶点,
2.又由中序遍历结果,以A为分界点,将树分为两部分。
又由后序遍历结果,知B为A的左子树顶点
所以目前为止我们的二叉树为
3.从左子树开始分析
由中序遍历结果知,C为B的左子树顶点。D为B的右子树顶点
继续同理分析,G为D的右子树顶点,而对于EF,中序遍历顺序为EF,后序遍历为FE,只有一种情况,E为F的双亲结点
且F为E的右子树顶点,因为如果F为E的左子树顶点,那么中序遍历的结果就是FE,而不是EF。至此,左子树推算完毕。
4.然后是A的右子树
由中序遍历分析得,JILK为H的左子树部分,NOMP为H的右子树部分
先分析JILK,I为H的左子树顶点,M为H的右子树顶点
由中序遍历知I的左子树为J,右子树为LK,并且对于LK,K为I的右子树顶点,L为K的左子树顶点,因为如果L为K的右子树顶点,中序遍历结果将是KL
再分析NOMP
由中序遍历,P为M的右子树顶点,NO为M的左子树部分,且中序遍历结果为NO,后序遍历结果为ON,所以N为M的左子树顶点,O为N的右子树顶点,所以有
至此二叉树已经完整的推算出来了。
可能看起来很复杂,但是大家在掌握后序遍历,中序遍历的基础上进行理解分析得话,还是比较容易掌握的。多多练习就好。