二叉树遍历的相互转化

二叉树遍历的相互转化

给出中序和后续求先序

题目描述
给出一个二叉树的中序排列与后序排列,求它的先序排列。(约定树结点用不同的大写字母表示,长度<=8).
输入
2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
输出
1行,表示一棵二叉树的先序。
样例输入
BADC
BDCA
样例输出
ABCD
这个题也是折磨我许久0.0,知道看了strchr的用法才明白。参考了一位大佬的题解但是找不到他博客了(难搞)
strchr的用法可以看我这篇strchr的用法
下面进入正式题解:
给出中序和后序,首先后序最后一个既是根节点,在中序遍历中找到根节点,左边为左子树右边为右子树。那么根据dfs思路,可以把中序和后序分成左子树的中序 后序遍历和右子树的中序和后序遍历,一次次分割,没次循环输出后序遍历的最后一个元素,循环完之后即得到先序排列。
假定mid:1234567 last:2315764
则先输出4 4既是根,在mid中找到4的位置,左边123既是左子树元素,567既是右子树元素。进行分割 左子树:mid 123 last 231 右子树:mid 567 last 576。循环左子树 右子树。大致思路即使这样。代码看不懂的话还是去看一下上面链接了解一下strchr用法。

#include<bits/stdc++.h>
using namespace std;
int tree(char *mid,char *last) //引出mid,last数组 
{
 char *p,*q,t;  //定义指针 p负责last数组 q负责mid数组 记清哦! 
 if(!*mid) //若无左子树不循环 
 return 0;
 p=last+strlen(last)-1; //找到last数组中最后一个字符 即根 
 cout<<p<<" ";
 q=strchr(mid,*p); //在mid数组中找到根位置 
 *p=0; //根输出后返回空字符防止重复 
 p=q-mid+last; //q-mid为根在mid中前面还有几个字符 
 t=*p; //保留 右子树第一个字符 
 *p=0,*q=0; //赋值为空字符 将中序和后序分成左右子树 
 tree(mid,last); //先循环左子树 
 *p=t; //右子树恢复刚才的值 
 tree(q+1,p); //循环右子树 
}
int main()
{
 char mid[1000],last[1000]; //用来储存中序和后序 
 cin>>mid;cin>>last;
 tree(mid,last); //进行循环 
 return 0;
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值