由遍历序列确定二叉树--数据结构

由二又树的遍历可知,任意一棵二又树的先序、中序、后序遍历序列均是唯一的。
由先序和中序序列,或由中序和后序序列,均可以唯一确定一棵二叉树。(注意:由先序和后序无法确定一颗二叉树

1.由先序和中序序列确定二叉树

根据二叉树遍历的定义可知,二叉树的 先序遍历是先访问根结点D,其次遍历左子树L,最后遍历右子树R, 即在先序序列中,第一个结点必是根D;
而另一方面,由于 中序遍历是先遍历左子树L,其次访问根D,最后遍历右子树R, 即在中序序列中,根结点前是左子树序列,后是右子树序列。因此,由先序和中序序列确定二又树的方法如下:

①由先序序列中的第一个结点确定根结点D。
②由根结点D分割中序序列:D之前是左子树上的中序序列.D之后是右子树R的中序序列,同时获得L和R的结点个数。
③根据左子树L的结点个数,分割先序序列:第一结点根D,之后是左子树L的先序序列,最后是右子树R的先序序列。

至此,已确定了根D,左子树L的先序和中序序列,右子树R的先序和中序序列。如此类推,再对每棵子树进行上述处理,便可确定整棵二叉树。

个人理解:

第一步:首先根据先序序列确定根结点,再由确立的根结点分割中序序列,确立根结点左右子树的结点;
第二步:确立根结点左右子树的结点之后,先看左子树的结点在先序序列中谁更靠前(最靠前的为该层的左节点),再看右子树的结点在先序序列中谁更靠前(最靠前的为该层的右节点);
第三步:在第二步确立了左右结点后,先由左结点分割中序序列,确立左结点以下的左右结点,再由右结点分割中序序列,确立右结点以下的左右结点。
第四步:确立左右结点左右子树的结点之后,先看左子树的结点在先序序列中谁更靠前(最靠前的为该层的左节点),再看右子树的结点在先序序列中谁更靠前(最靠前的为该层的右节点);
…(重复第三步第四步)

例子:
在这里插入图片描述

2.由中序和后序序列确定二叉树

类似于上述由先序和中序序列确定二叉树的方法,可得到由中序和后序序列确定二叉树的方法如下:
①由后序序列中的最后一个结点确定根结点D;
②由根结点D分割中序序列:D之前是左子树L的中序序列,D之后是右子树R的中序序列,同时获得L和R的结点个数。
③根据左子树L的结点个数分割后序序列:首先是左子树L的
后序序列,随后是右子树R的后序序列,最后是根结点D。

至此,已确定了根D,左子树L的中序和后序序列,右子树R的中序和后序序列。如此类推,再对每棵子树进行上述处理,便可确定整棵二叉树。

总体来说,数据结构需要自己慢慢理解,而不是一蹴而就,自己对它的理解还仅仅停留在栈中,要好好努力了,fighting!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值