二叉树遍历题解(已知中序,层次遍历,求后序遍历)
来源:互联网 发布:win7桌面显示网络图标 编辑:程序博客网 时间:2024/05/22 16:12
题目:
树和二叉树基本上都有先序、中序、后序、按层遍历等遍历顺序,给定中序和其他一种遍历的序列就可以确定一棵二叉树的结构。
假设一棵二叉树一个结点用一个字符描述,现在给出中序和按层遍历的字符串,求该树的先序遍历字符串。
输入:
输入共两行,每行是由字母组成的字符串(一行的每个字符都是唯一的),分别表示二叉树的中序遍历和按层遍历的序列。
输出:
输出就一行,表示二叉树的先序序列。
样例输入:DBEAC
ABCDE
样例输出:ABDEC
题解:
本题不需要建树。
做题前先弄明白中序遍历和层次遍历的特点;
首先中序遍历的根结点左侧为左子树,右侧为右子树,而先序遍历优先输出根结点,再遍历左子树,最后遍历右子树,因此,不难想到,先在中序遍历中找到根结点,再先后递归左右子树;
然后,我们单开一个数组从1到结尾给层次遍历的结果做标记,方便在递归中找到根结点(即使递归到了子树也可行)。见代码:
#include<stdio.h>#include<string.h>int len,mark[102]; //用来给中序遍历做标记char s1[102],s2[102]; //储存遍历void tree(int l,int r){ //递归函数 if(l>r)return; //返回条件,不能等于 int i,j,min=0x7fffff/*int范围的最大值*/,root; for(i=l;i<=r;i++){ if(mark[s1[i]]<min){ min=mark[s1[i]];root=i; //在中序遍历中找到层次遍历里的最靠前的结点(即先序遍历中要求优先输出的根结点 } } printf("%c",s1[root]); //输出根结点 tree(l,root-1); //先遍历左子树 tree(root+1,r); //再遍历右子树,顺序不能调换}int main(){ scanf("%s%s",s1+1,s2+1); len=strlen(s2+1); int i; for(i=1;i<=len;i++) mark[s2[i]]=i; //做标记,虽然s2[i]为字符,但视为ASCII码值,越靠前标记值越小 tree(1,len); }欢迎指点
3 0
- 二叉树遍历题解(已知中序,层次遍历,求后序遍历)
- 数据结构,二叉树已知后续中序,建树,层次遍历;
- 已知二叉树先序遍历中序遍历求后序遍历
- POJ 2255 二叉树遍历 已知前序遍历 中序遍历 求后序遍历
- 已知二叉树的前序遍历和中序遍历求后序遍历(二叉树)
- 二叉树系列:已知二叉树的中序遍历和前序遍历,求后序遍历
- 已知前序遍历和中序遍历求后序遍历和层次遍历
- 六、树和二叉树--(3)已知先序遍历和中序遍历求后序遍历
- 已知先序遍历和中序遍历求后序遍历——二叉树
- 已知二叉树的中序遍历和前序遍历,如何求后序遍历
- 已知二叉树的中序遍历和前序遍历,如何求后序遍历
- 已知二叉树的前序遍历和中序遍历求后序遍历
- 二叉树已知前序遍历和中序遍历,编程求后序遍历。
- 已知二叉树的前序遍历中序遍历,求后序遍历
- 已知先序遍历和中序遍历求后序遍历——二叉树
- 已知二叉树的先序遍历和中序遍历,如何求后序遍历
- java实现二叉树已知先序遍历和中序遍历求后序遍历
- 已知二叉树的前序遍历,中序遍历,求后序遍历的问题。
- 集成Diagram Viewer跟踪流程
- 疫情控制
- h-ui跳转到新页面
- 数据结构-STL
- 感悟期望
- 二叉树遍历题解(已知中序,层次遍历,求后序遍历)
- 分布式存储系统设计的若干原则
- 使用BannerView做无限轮播
- 泊松分布的描述
- 错误: 代理抛出异常错误: java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException
- android studio svn 忽略
- 代码审查codereview工具
- QT 线程
- 快速发布library到JitPack