c语言已知先序还原二叉树,04已知先序中序或后序还原二叉树(示例代码)

首先,我们看看前序、中序、后序遍历的特性:

前序遍历:

1.访问根节点

2.前序遍历左子树

3.前序遍历右子树

(个人觉得这个命名略微有误导性,因为前序的“前”容易让人误会成树的最前边(视觉上的左边)。记住前序遍历就是最直接(直觉上的)遍历——中左右)

中序遍历:

1.中序遍历左子树

2.访问根节点

3.中序遍历右子树

(同样是有误导性的名字。 遍历顺序——左中右)

后序遍历:

1.后序遍历左子树

2.后序遍历右子树

3.访问根节点

(同样是有误导性的名字,“后”字没有任何意义,所有二叉树的遍历,左边一定在右边的之前进行遍历。 遍历顺序——左右中。)

最近又想出一个帮助记忆的方法——把先/中/后 当做是“中”的访问时序。如 先序 就是 “中”排在最前面(中左右),以此类推。

接着,铭记总的方针

1. 找到根节点,确定左子树,确定右子树 (最重要)

2. 对左子树进行递归分析

3.对右子树进行递归分析

一、已知先序、中序遍历,求后序遍历

例:

先序遍历:         GDAFEMHZ

中序遍历:         ADEFGHMZ

思路分析:

1. 根据先序遍历的特点——中左右,第一个元素一定是根节点,所以立刻确定G是根节点。

2. 既然确定了G是根节点,再根据中序遍历的特点——左中右,在根节点G之前的ADEF就是左子树,根节点G之后的HMZ就是右子树。

3.接着分析左子树(思路和第1,2步一样)。把左子树的所有元素(即ADEF这四个元素)在先序遍历和中序遍历中的顺序拿出来进行比较。

先序的顺序是DAFE(中左右),中序遍历是ADEF(左中右)。

通过先序特点得出D是左子树的节点,通过中序特点确定唯一一个在D左边的A是左子树中的左叶子,右边的是EF。

观察EF的相对位置,在先序(中左右)是FE,在中序(左中右)EF,所以得出EF的关系是左中。

到此得出左子树的形状

format,png

4.接着分析右子树(思路和第1,2步一样),把右子树的元素(HMZ)在先序遍历和中序遍历中的顺序拿出来进行比较。

先序的顺序是MHZ(中左右),中序遍历是HMZ(左中右)。

根据先序遍历的特点确定M是右子树的节点,根据中序遍历的特点确定H是左叶,Z是右叶。

所以右子树的形状

format,png

5.于是得出了整棵树的形状

format,png

那么后序遍历就是AEFDHZMG

二、已知中序和后序遍历,求前序遍历

中序遍历:       ADEFGHMZ

后序遍历:       AEFDHZMG

思路分析:(记住方针是一样的)

1.根据后序遍历的特点(左右中),根节点在结尾,确定G是根节点。根据中序遍历的特点(左中右),确定ADEF组成左子树,HMZ组成右子树。

2.分析左子树。ADEF这四个元素在后序遍历(左右中)中的顺序是AEFD,在中序遍历(左中右)中的顺序是ADEF。根据后序遍历(左右中)的特点确定D是左子树的节点,根据中序遍历(左中右)的特点发现A在D前面,所以A是左子树的左叶子,EF则是左子树的右分枝。

EF在后序(左右中)和中序(左中右)的相对位置是一样的,所以EF关系是左右或者左中,排除左右关系(缺乏节点),所以EF关系是左中。

到此得出左子树的形状

format,png

3. 分析右子树。HMZ这三个元素在中序遍历(左中右)的顺序是HMZ,在后序遍历(左右中)的顺序是HZM。根据后序遍历(左右中)的特点,M在尾部,即M是右子树的节点。再根据中序遍历(左中右)的特点,确定H(M的前面)是右子树的左叶子,Z(M的后面)是右子树的右叶子。

所以右子树的形状

format,png

4. 最后得出整棵树的形状

format,png

那么先序遍历就是GDAFEMHZ .

三、已知前序、后序遍历,求中序遍历

这种情况,可能无法还原出唯一的二叉树,因为无法唯一确定根节点的左右子树。

(其实还不大清楚具体的证明和原因,欢迎指教)

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值