您的位置:首页 > 其它

二叉树遍历的相互转化

2020-04-05 12:15 113 查看

二叉树遍历的相互转化

给出中序和后续求先序

题目描述
给出一个二叉树的中序排列与后序排列,求它的先序排列。(约定树结点用不同的大写字母表示,长度<=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;
}

  • 点赞
  • 收藏
  • 分享
  • 文章举报
Liquor___ 发布了30 篇原创文章 · 获赞 1 · 访问量 789 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: