在开始说如何恢复这个二叉树的具体内容前,先说一下二叉树是什么东西以及中序后序是一个什么样的定义。
一、二叉树
在讲二叉树前,先说一下树的基本概念,树结构是一个有N个有限节点组成的一个有层次关系的结构,每个节点有0个子节点或者多个子节点,没有父节点的节点称之为根节点,也就是说每个节点都有父节点但有且只有一个。树的种类比较多,常见的就是二叉树,也有三、四、五---直到N叉树,那么这个数字代表的意义就是每个父节点下面最多有几个子节点的上限,那么二叉树相关的基本概念如 节点度、树的度、叶节点和一些基础特性可以参考其他的文章,这里就不一一赘述了。
借用一个二叉树的图,这是一个简单的二叉树的形状。
二、前中后序
那么二叉树的遍历分成了广度优先遍历和深度优先遍历,深度优先遍历又分成了前中后序遍历三种,那么怎么区分这三种遍历的方法呢,就是以中节点也就是遍历每个父节点的顺序来区分。父节点在每次都第一次访问的:按中左右访问为前序遍历;第二次访问:左中右的称为中序遍历;第三次访问的左右中称为后序遍历。
那么下面开始介绍如何从中序后序遍历恢复一颗二叉树,借用一棵树的顺序如下:
怎么恢复呢,首先我们每次可以把根节点、左右节点找出来,上面的排序一共15个节点,那么除去根节点,那就得把7个节点当成左节点,另外7个当成右节点,那么根据中序遍历的规则我们可以容易看出1是根节点,[3 4 8 6 7 5 2]其中的一个是左节点、[10 9 11 15 13 14 12]是右节点,在后序遍历也能看出来
那么第一轮就确定了这样的形状 ,接着我们从左边开始恢复,第二轮左边的中序是[3 4 8 6 7 5 2],后序是[8 7 6 5 4 3 2],那么相同的节点在最右边2,那根节点确定了是2,中后都在右边的情况且右边没节点了只有左中这一种情况,那右边节点就为空了,那第二轮的结构就如下:
那么根据以上规则,第三轮 前序为[3 4 8 6 7 5]后序为[8 7 6 5 4 3],那这次根据后序原则3为根节点,那[4 8 6 7 5]就为右节点了,第四轮前序[4 8 6 7 5]、后序为[8 7 6 5 4],根节点为4 [8 6 7 5]为右节点,第五轮[8 6 7 5]、[8 7 6 5],5为根节点,[8 6 7]为左节点,右边的那部分也可以按照同样的规则确定出来,最终的形状如下,有兴趣的可以去尝试一下。