数据结构篇:二叉树(三:根据中序和后序遍历结果推算出完整二叉树)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_15020543/article/details/84405277

我们先理解一下前中后序遍历,这是基础。

//前序遍历
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的右子树顶点,所以有

至此二叉树已经完整的推算出来了。

可能看起来很复杂,但是大家在掌握后序遍历,中序遍历的基础上进行理解分析得话,还是比较容易掌握的。多多练习就好。

猜你喜欢

转载自blog.csdn.net/qq_15020543/article/details/84405277
今日推荐