二叉树遍历问题:前、中、后遍历顺序知二求一

二叉树遍历问题:前、中、后遍历顺序知二求一

二叉树是每个结点(node)拥有子结点不超过两个的树。二叉树的遍历(Traversal)是指沿某条路线,依次对树的每个结点做且仅做一次访问的过程。其主要方式有前序遍历(或称先序遍历)(Preorder Traversal)、中序遍历(Inorder Traversal)、后序遍历(Postorder Traversal)。前序遍历指对每个结点,先访问其根结点,再访问其左侧子结点,最后访问其右侧子结点;中序遍历指对每个结点,先访问其左侧子结点,再访问其根结点,最后访问其右侧子结点;后序遍历指对每个结点,先访问其左侧子结点,再访问其右侧子结点,最后访问其根结点。以下讨论以D、L、R分别代指根结点、左侧子结点、右侧子结点。

图1-1:二叉树遍历通式

根据二叉树的两种遍历顺序求第三种遍历顺序实际上是求树的形态。对于一棵确定的二叉树,其三种遍历方式是唯一的。因此只要确定了树的形态,就可以确定各种遍历顺序。二叉树遍历过程是一种递归过程。如对左侧子结点的访问,即为对左侧子树的遍历。即二叉树遍历通式图1-1所示。据此,可由三种遍历方式的特点确定根结点,再不断将剩余结点划分为左子树与右子树,并最终确定树的形态,得到未知的遍历顺序。

下面以图1-2中所示的一棵比较一般的简单二叉树为例,说明前、中、后遍历顺序知二求一的详细过程。

"图1-2:二叉树示例"

1.由前序遍历、中序遍历求后序遍历

由前序遍历(DLR)的规则可知,首个访问对象必为树根(即首个根结点),后若干项为对左子树的访问,再后若干项直至最后是对右子树的访问。

例如:已知对某二叉树前序遍历顺序为:ABDEGHCFI,中序遍历顺序为DBGEHACIF,求后序遍历顺序。

解:由前序遍历顺序可确定第一层根结点为A,记为D1=A。由中序遍历顺序可确定第一层的左子树中序遍历为L1=(DBGEH)in,右子树中序遍历为R1=(CIF)in。配合前序遍历,可知第一层的左子树前序遍历为L1=(BDEGH)pre,右子树前序遍历为R1=(CFI)pre。再根据对L1中序、前序遍历的结果,易知D2=B,同理可得各个结点左、右两子树的组成,再不断迭代即可得到整个树的结构。

"图1-3:迭代找树"

由后序遍历、中序遍历求前序遍历的过程与之类似。

2.由前序遍历、后序遍历求中序遍历

由前序遍历的规则,可知首个访问对象必为树根,第二个访问对象必为树根左子树的树根。同理,对于后序访问,最后一个访问对象为树根,而倒数第二个访问对象为右子树的树根。可据此将所有访问对象不断划分成各个左、右子树,最终得到二叉树结构。

扫描二维码关注公众号,回复: 10524753 查看本文章

例如:已知对某二叉树前序遍历顺序为:ABDEGHCFI,后序遍历顺序为DGHEBIFCA,求中序访问顺序。

解:由前序遍历顺序可确定第一层根结点为A,记为D1=A;左子树根结点为B,记为DL=B。由后序遍历顺序可确定第一层根结点为A;右子树根结点为C,记为DR=C。依此可根据前序遍历的顺序得到对左、右子树的前序遍历顺序,即L1=(BDEGH)pre,R1=(CFI)pre;可根据后序遍历顺序得到对左、右子树后序遍历顺序,即L1=(DGHEB)post,R1=(IFC)post。再不断迭代可得到整个树的可能结构。

"图1-4:迭代找树2"

有一种特殊情况需要说明:当前序遍历第二个访问对象与后序遍历倒数第二个访问对象相同时,可认为是该结点左子树树根与右子树树根相同,也就是说该结点仅有一个子结点。在前序访问和后序访问中,此时这个子结点可以认为是该结点的左结点,也可认为是该结点的右结点,这不会影响它在前序访问和后序访问中被访问的顺序,但是会影响该结点在中序访问中被访问的顺序。因此,若二叉树中某结点仅有一个子结点时,不能由前序遍历和后序遍历得出中序遍历的访问顺序。

猜你喜欢

转载自www.cnblogs.com/gznest/p/12640777.html