6.7由遍历序列确定的二叉树
在二叉树的遍历中,我们知道,给定一棵二叉树和一种遍历方法,就可以确定该二叉树相应的线性序列。那么,根据给定的遍历序列能否唯一的确定一棵二叉树呢?
显然,只由一种序列是无法确定二叉树的,要根据遍历序列确定二叉树,至少需要知道该二叉树的两种遍历序列。
表 6-1 列出了两种遍历序列组合确定二叉树的情况。
例已知一棵二叉树的先序序列与中序序列分别为:
A B C D E F G H I
B C A E D G H F I
试构造该二叉树。
分析:根据定义,二叉树的先序遍历是先访问根结点,其次再按先序遍历方式遍历根 结点的左子树,最后按先序遍历方式遍历根结点的右子树。这就是说,在先序序列中,第一 个结点一定是二叉树的根结点。如下图(a)所示。
另一方面,中序遍历是先遍历左子树,然后访问根结点,最后再遍历右子树。这样, 根结点在中序序列中必然将中序序列分割成两个子序列,前一个子序列是根结点的左子树的 中序序列,而后一个子序列是根结点的右子树的中序序列。如下图(b)所示。
根据这两个子序列,在先序序列中根据中序序列对应的左子树的先序序列和右子树的先 序序列。在先序序列中,左子序列的第一个结点是左子树的根结点,右子序列的第一个结点 是右子树的根结点。这样,就确定了二叉树的三个结点。同时,左子树和右子树的根结点又 可以分别把左子序列和右子序列划分为两个子序列,如此递归下去,当取尽先序序列中的结 点时,便可以得到一棵二叉树。
具体到本题目,首先由先序序列可知,结点 A 是二叉树的根结点。其次,根据中序序列,在 A 之前的所有结点都是根结点左子树的结点,在 A 之后的所有结点都是根结点右子 树的结点,由此得到下图(a)所示的状态。然后再对左子树进行分解,得知 B 是左子树的 根结点,又从中序序列知道,B 的左子树为空,B 的右子树只有一个结点 C。接着对 A 的右子树进行分解,得知 A 的右子树的根结点为 D;而结点 D 把其余结点分成两部分,即左子 树为 E,右子树为 F、G、H、I,如下图(b)所示。接下去的工作就是按上述原则对 D 的右子树继续分解下去,最后得到如下图(c)所示的整棵二叉树。