二叉树遍历的相互转化
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; }
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 关于java对象之间相互转化的多种方式
- 前台页面中json和字符串相互转化
- java 二进制数据与16进制字符串相互转化方法
- Android中Bitmap,byte[],Drawable,InputStream相互转化工具类
- C++中各种string的相互转化
- UIImage与Base64图片的相互转化
- C++ WINDOWS下 wchar_t *和char * 相互转化总结篇
- 如何获取精确到毫秒的当前时间以及 日期与时间的相互转化
- Json 与 string 的相互转化
- Java Bean与Map之间相互转化的实现
- c++的字符串char与string相互转化,以及string的,切割,替换字符,字符串拼接方法
- PowerDesigner Comment和name相互转化
- java字符串与二进制的相互转化
- CByteArray与CString相互转化
- java时间的毫秒数和C#的datetime时间相互转化方法
- java_时间戳与Date_相互转化
- jQuery对象和原生JavaScript对象不能混用的问题及其相互转化
- java InputStream,String,File byte相互转化
- 块级元素与行内元素的区别以及相互转化
- C语言 字符串和C++ string对象的相互转化