确定二叉树结构

问题:给出一颗二叉树的中序遍历和后序遍历,求其前序遍历。

思路:后序遍历中,最后一个节点一定是根节点rt,中序遍历中rt左边的节点是左子树,右边的节点为右子树。对子树再重复上述过程即可。因为要求前序遍历,顺序为根,左子树,右子树。所以在求左子树的根之前输出根节点即可。

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
string s1,s2;
void dfs(int l1,int r1,int l2,int r2){
    int rt=s1.find(s2[r2]);
    printf("%c",s2[r2]);
    if(rt>l1)dfs(l1,rt-1,l2,l2+rt-l1-1);
    if(rt<r1)dfs(rt+1,r1,l2+rt-l1,r2-1);

}
int main(){
    cin>>s1>>s2; //中序序列,后序序列。
    int len=s1.size();
    dfs(0,len-1,0,len-1);
    printf("\n");
}

dfs函数功能为对中序序列 [l1,r1] 后序序列 [l2,r2]求前序遍历。

s2[r2]是后序序列中最后一个节点,为当前子树的根, rt是这个根在前序序列中的下标。

如果rt>l1,说明具有左子树,rt<r1,说明具有右子树。

求出根rt后,

中序序列[l1,r1]中,[l1,rt-1]是左子树,[rt+1,r1]为右子树。左子树有rt-l1个元素

后序序列[l2,r2]中,r2是根,左子树为前rt-l1个元素,即[l2,l2+rt-l1-1],右子树为剩下的元素为[l2+rt-l1,r2-1];


https://www.luogu.org/problemnew/show/P1030

原题是给前序和中序求后序,稍作修改即可~

https://www.luogu.org/problemnew/show/UVA536

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值