利用已知的遍历顺序回溯二叉树

前言

之前有一个博客讲的是如何将一个中缀表达式改成后序表达式,然后代码就翻车了,数据反复横跳,后来想起来一个问题,单独一个中序遍历的结果是不能回溯出唯一一个二叉树,所以后序的结果自然不唯一。

有人可能要问了,二叉树和我中缀表达式有什么关系(你抓周树人和我鲁迅有什么关系)
那你看一下这个图:
在这里插入图片描述
中序:H * I- E + F / G
这不就是一个中缀表达式么,然后后序遍历:
H I * E - F G / +
就是中缀表达式的一个后缀表达式

这个图说明了一个表达式可以使用二叉树来存储,叶子为参数,非叶子结点为二元操作符(这里面没有取反,所以度数为0或2)

回溯分析

如果只给你一个先序(或者后序、中序)让你回溯一个二叉树,答案并不唯一
比如上述的中序表达式,下面这个图的中序遍历也是相同的。 (有avl树那味了)
在这里插入图片描述

那你可能会说,我给你两个遍历方式不行吗。

还真不一定行,如果给出的两个遍历方式中没有中序,也就是只给出先序和后序,也不能解决问题。因为我们需要先序或者后序在中序里面划分子树

这就不得不提我们的思路了,分而治之的思想:

  • 利用先序/后序的原理,根节点在第一个/最后一个,并在中序中寻找这个点随后以这个点为分解将原来的先序/后序划分成两部分,分别为两个子树,并计算两个的长度;
  • (这里先以后序为例,先序同理)用于后序为左子树、右子树、树根,并且我们知道中序中前半部分长度,也就是左子树的节点数,所以在后序中数出对应长度,这部分就是后序中的左子树了。
  • 重复上述过程,直到只剩一个结点,

例:
后序序列: 3424321
中序序列: 3241423
分析:
根节点:1
左子树有324,右子树有423(中序顺序)
后序的前三个是根节点左子树,4~6是右子树
根据后序的顺序,推测左子树的根节点是2,右子树的根节点是3,此时两个孩子确定了,同时孩子的孩子均为叶子,再根据任意一个顺序推断出孩子的左右
图示:
在这里插入图片描述
代码的前提:(C)
输入两个长度小于20的字符串,分别为中序和后序遍历的结果,要求构建二叉树并输出其先序遍历的结果。
需要判断两个字符串能否构建二叉树,(比较长度、字符串内容、以及在构建的时候能否成立),如果不能要给出提示。
主要函数(目的是先手判断和连接递归函数以及构建二叉树的函数)

btree* back(btree* bt)
{
   
    char in[20];//中序字符串
    char post[20];//先序字符串
    int plength,ilength;
    int count=0
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值