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),是二叉树中结点的个数.第二行给出其后序遍历序 ...
随机推荐
- 状态压缩 DP
D - Hie with the Pie Crawling in process... Crawling failed Time Limit:2000MS Memory Limit:65536 ...
- Mysql的一些常用命令
Mysql基本操作 创建表: create table test01_02(id varchar(50) not null auto_increment primary key, name nvarc ...
- Web前端开发基础 第一天(Html和CSS)
学习web前端开发基础技术需要掌握:HTML.CSS.JavaScript语言.下面我们就来了解下这三门技术都是用来实现什么的: 1. HTML是网页内容的载体.内容就是网页制作者放在页面上想要让用户 ...
- linux chmod 命令
Avril 首页 新随笔 管理 随笔 - 153 文章 - 1 评论 - 58 修改linux文件权限命令:chmod Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何 ...
- asp.net identity 2.2.0 中角色启用和基本使用(六)
创建用户管理相关视图 第一步:添加视图 打开UsersAdminController.cs 将鼠标移动到public ActionResult Index()上 右键>添加视图 系 ...
- 解决Windows下运行php Composer出现SSL报错的问题
解决Windows下运行php Composer出现SSL报错的问题 2015-01-14 20:05 在windows下运行composer却出现SSL报错: E:\www>php -f ...
- 关于Action快捷键和小键盘的问题
在使用全尺寸键盘的时候 键盘右边都有一排小键盘 但是这个小键盘的数字键值和普通键盘的数字键值是不一样的 在ANSI码里 标准数字键值是$30..$39, 而小键盘的键值是$60..$69 这样问题就来 ...
- 最长公共子序列PK最长公共子串
1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. (1)递归方法求最长公共子序列的长度 1) ...
- 文件上传去除"Content-Disposition: form-data"
某个项目中为了统一处理文件上传业务,创建了一个FileUpload Handle,由于上传客户端用到各种技术,当时为了方便断点续传,就直接接收请求中的文件内容(可能是分片),所以处理的不是规范的htt ...
- 优化SQL Sever查询语句的几个要点
1.不要在Where子句中的“=”左边进行函数.算术运算或其他表达式运算,否则系统将可能无法正确使用索引. 2.尽量不要在Where条件中使用函数,否则将不能利用索引. 3.在Where条件中使用明确 ...