[树的遍历]树的遍历(PTA)

给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数N(≤),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。

输出格式:

在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7

输出样例:

4 1 6 3 5 7 2

思路:

已知:后序遍历和中序遍历
画树的方法:
第一步:根据后序遍历的特点,我们知道后序遍历最后一个节点即为根节点,即根节点4

代码如下:

复制代码
 1 #include <iostream>
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 const int maxn = 35;
 5 int hx[maxn],zx[maxn];
 6 int n;
 7 struct node
 8 {
 9     int l,r;
10 };
11 node pp[maxn];
12 int build(int la,int ra,int lb,int rb)
13 {
14     if(lb>rb)
15         return 0;
16     int root,pos1,pos2;
17     root=hx[ra];
18     pos1=lb;
19     while(zx[pos1]!=root)
20         pos1++;
21     pos2=pos1-lb;
22     pp[root].l=build(la,la+pos2-1,lb,pos1-1);
23     pp[root].r=build(la+pos2,ra-1,pos1+1,rb);
24     return root;
25 }
26 void bfs()
27 {
28     queue<int> q;
29     q.push(hx[n]);
30     printf("%d",hx[n]);
31     while(!q.empty())
32     {
33         int now=q.front();
34         q.pop();
35         if(now!=hx[n])
36             printf(" %d",now);
37         if(pp[now].l)
38             q.push(pp[now].l);
39         if(pp[now].r)
40             q.push(pp[now].r);
41     }
42     printf("\n");
43 }
44 int main()
45 {
46     scanf("%d",&n);
47     for(register int i=1;i<=n;i++)
48         scanf("%d",&hx[i]);
49     for(register int i=1;i<=n;i++)
50         scanf("%d",&zx[i]);
51     build(1,n,1,n);
52     bfs();
53     //cout << "Hello world!" << endl;
54     return 0;
55 }
View Code
复制代码

 

 
 
posted @   听风不成泣  阅读(1354)  评论(3编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示