C语言数据结构--关于二叉树的恢复

从二叉树的遍历可以知道,任意一棵二叉树节点的先序序列和中序序列都是唯一的。反过来,若已知节点的先序序列和中序序列,能否确定这棵二叉树呢?这样确定的二叉树是否是唯一的呢?

答案是肯定的!

根据定义,二叉树的先序遍历是先访问根节点,再按照先序遍历的方式遍历根节点的左子树,最后按照先序遍历的方式遍历根节点的右子树。这就是说,在先序序列中,第一个节点一定是二叉树的根节点。中序遍历是先遍历左子树,然后访问根节点,最后遍历右子树。这样,根节点在中序序列当中必然将中序序列分割为两个子序序列,前一个子序序列是根节点的左子树的中序序列,而后一个子序序列是根节点的右子树的中序序列。根据这子序序列,在先序序列中找到对应的左子序列和右子序列。在先序序列中,左子序列的第一个节点是左子树的根节点,右子序列的第一个节点是右子树的根节点。这样,就确定了二叉树的三个根节点。同时,左子树和右子树的根节点又可以分别把左子序列和右子序列划分成两个子序,如此递归下去,当取尽先序序列中的节点时,便可以得到一棵二叉树了。

同样的道理,由二叉树的后序序列和中序序列也可以唯一的确定一棵二叉树了。因为,依据后序遍历和中序遍历的定义。后序遍历的最后一个节点,就如同先序遍历的第一个节点,可将中序序列分为两个子序序列,分别为这个节点的左子树的中序序列和右子树的中序序列,再拿出后序序列的倒数第二个节点,并继续分割中序序列,如此递归下去,当倒着取尽后序序列中的节点的时候,便可以得到一棵二叉树了。

下面通过一个例子,来给出由二叉树的先序序列和中序序列构造的唯一的一棵二叉树的实现过程。

已知一棵二叉树的先序序列和中序序列:

    先序序列:A        B        C        D        E        F        G        H        I

   后序序列:B        C        A        E        D        G        H        F        I

        首先,由先序序列可以知道,节点A是二叉树的根节点。其次,根据中序序列,在A之前的所有节点都是根节点左子树的节点,在A之后的所有节点都是根节点右子树的节点,由此得到如图一所示的状态。然后,再对左子树进行分解,得知B是左子树的根节点,又从中序序列知道,B的左子树为空,B的右子树只有一个节点C;接着对A的右子树进行分解,得知A的右子树的根节点为       D,而节点D又把其余的节点分成了两部分,即左子树为E,右子树为F,G,H,I,如图二所示。接下来的工作就是按上述原则对D的右子树继续分解下去,最后得到图三的整颗二叉树。

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值