YTU 3023: 树的遍历
原文链接:https://www.dreamwings.cn/ytu3023/2617.html
3023: 树的遍历
时间限制: 1
Sec 内存限制: 128
MB
提交: 3 解决: 2
题目描述
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入
输入第一行给出一个正整数N(<=30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
样例输入
7 2 3 1 5 7 6 4 1 2 3 4 5 6 7
样例输出
4 1 6 3 5 7 2
提示
若不存在这样的序列,则什么也不输出
二叉树的构造
根据先序遍历序列和中序遍历序列构建二叉树
假定已知二叉树如下:
___7___ / \ 10 2 / \ / 4 3 8 \ / 1 11
那么它的先序遍历和中序遍历的结果如下:
preorder = {7,10,4,3,1,2,8,11} inorder = {4,10,3,1,7,11,8,2}
需要关注的几个要点:
1)先序遍历的第一个结点总是根结点。如上图中的二叉树,根结点为7,也是先序遍历的第一个值。先序遍历时父亲结点总是在孩子结点之前遍历。
2)可以观察到在中序遍历中,7是第4个值(从0开始算起)。由于中序遍历顺序为:左子树,根结点,右子树。所以7左边的{4,10,3,1} 这四个结点属于左子树,而根结点7右边的{11,8,2}属于右子树。
3)可以从上面的结论很轻松的得到递归式。在构建了根结点7后,我们可以根据中序遍历{4, 10, 3, 1} 和{11,8,2}分别构建它的左子树和右子树。我们同时需要相应的先序遍历结果用于发现规律。我们可以由先序遍历知道左右子树的先序遍历分别是{10,4, 3, 1}和{2, 8, 11}。左右子树也分别为二叉树,由此可以递归来解决问题。
4)关于如何得到根结点在中序遍历中的位置,我们使用线性扫描查找位置,则每次查找需要O(N)的时间。需要注意的是,这里的二叉树结点值不能有相同的值。
中序遍历+后序遍历构造二叉树的思想和上面一样~
代码:
#include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #define SizeMax 105 using namespace std; typedef struct Node { int data; Node* lchild; Node* rchild; } Node; Node *CreateBT2(int *post,int *in,int n) { Node *b; int r,*p,k; if(n<=0)return NULL; r=*(post+n-1); b=(Node*)malloc(sizeof(Node)); b->data=r; for(p=in; p<in+n; p++) if(*p==r)break; k=p-in; b->lchild=CreateBT2(post,in,k); b->rchild=CreateBT2(post+k,p+1,n-k-1); return b; } void Print(Node *r) { Node *p; Node *pr[SizeMax]; int rear=-1,front=-1; rear++; pr[rear]=r; while(rear!=front) { front=(front+1)%SizeMax; p=pr[front]; printf("%d ",p->data); if(p->lchild!=NULL) { rear=(rear+1)%SizeMax; pr[rear]=p->lchild; } if(p->rchild!=NULL) { rear=(rear+1)%SizeMax; pr[rear]=p->rchild; } } } int main() { int N; scanf("%d",&N); int a[N],b[N]; for(int i=0; i<N; i++) scanf("%d",a+i); for(int i=0; i<N; i++) scanf("%d",b+i); Node* result=CreateBT2(a,b,N); Print(result); return 0; }
YTU 3023: 树的遍历的更多相关文章
- 数据结构--树(遍历,红黑,B树)
平时接触树还比较少,写一篇博文来积累一下树的相关知识. 很早之前在数据结构里面学的树的遍历. 前序遍历:根节点->左子树->右子树 中序遍历:左子树->根节点->右子树 后序遍 ...
- 团体程序设计天梯赛-练习集L2-006. 树的遍历
L2-006. 树的遍历 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历 ...
- leetcode404-----简单的树的遍历
Find the sum of all left leaves in a given binary tree. Example: 3 / \ 9 20 / \ 15 7 There are two l ...
- pat L2-006. 树的遍历
L2-006. 树的遍历 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历 ...
- L2-006. 树的遍历
题目链接:L2-006. 树的遍历 今天一神给我手敲二叉树模板,瞬间就领悟了,感觉自己萌萌哒! 看上去很直观! #include <iostream> #include <cstdi ...
- js实现对树深度优先遍历与广度优先遍历
深度优先与广度优先的定义 首先我们先要知道什么是深度优先什么是广度优先. 深度优先遍历是指从某个顶点出发,首先访问这个顶点,然后找出刚访问这个结点的第一个未被访问的邻结点,然后再以此邻结点为顶点,继续 ...
- L2-006 树的遍历 (25 分) (根据后序遍历与中序遍历建二叉树)
题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805069361299456 L2-006 树的遍历 (25 分 ...
- 团体程序设计天梯赛 L2-006. 树的遍历 L2-011. 玩转二叉树
L2-006. 树的遍历 #include <stdio.h> #include <stdlib.h> #include <string.h> #include & ...
- L2-006 树的遍历 (后序中序求层序)
题目: 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数.第二行给出其后序遍历序 ...
随机推荐
- Javascript 编程小技巧总结(部分内容借鉴他人)
1 – 使用===,而不是== ==(或!=)操作符在需要的时候会自动执行类型转换.===(或!==)操作不会执行任何转换.它将比较值和类型,而且在速度上也被认为优于==. 2 – 使用闭包实现私有变 ...
- HDU1224 DP
Free DIY Tour Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- jquery ui bootstrap日期插件
http://blog.csdn.net/php_897721669/article/details/7404527 搜索“jquery ui日期插件怎么显示年份”? $("#datepic ...
- MySQL数据恢复和复制对InnoDB锁机制的影响
MySQL通过BINLOG记录执行成功的INSERT,UPDATE,DELETE等DML语句.并由此实现数据库的恢复(point-in-time)和复制(其原理与恢复类似,通过复制和执行二进制日志使一 ...
- C# - 时间格式
如果是字符串,需要先转化为DateTime格式 DateTime ExDate = DateTime.Parse(dt.Rows[]["HKMonth"].ToNotNullStr ...
- String-自定义功能
<script> /* *发现js中的String对象有限,想要对字符串操作的其他功能. *比如:去除字符串两端的空格.这时只能自.定义 */ //去除字符串两端的空格 function ...
- ThinkPHP 3.2.3 Widget 扩展的使用
ThinkPHP3.2.3 手册中 Widget 扩展的地址是: http://www.kancloud.cn/manual/thinkphp/1862 Widget 扩展一般用于页面组件的扩展,和自 ...
- lua 可变参数
问题:对可变参数传递的时候,采用如下方案: local cellData = {MsgText = msgText,Param = ...,CallBackFunc = callBackFunc,Ca ...
- JS中的混合模式
function Animation(list) { this.box = document.getElementById(list.id); this.size = list.size; this. ...
- linux 服务器对拷命令scp
1.今天在进行linux下服务部署时由于重新部署的繁杂,所以我决定用scp命令在linux线上服务器(A)拷贝一份服务程序到现有的服务器(B)上: 具体的操作命令是:scp -r A_username ...