PTA L2-035 完全二叉树的层序遍历(树的遍历)
L2-035 完全二叉树的层序遍历 (25分)
一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树。对于深度为 D 的,有 N 个结点的二叉树,若其结点对应于相同深度完美二叉树的层序遍历的前 N 个结点,这样的树就是完全二叉树。
给定一棵完全二叉树的后序遍历,请你给出这棵树的层序遍历结果。
输入格式:
输入在第一行中给出正整数 N(≤30),即树中结点个数。第二行给出后序遍历序列,为 N 个不超过 100 的正整数。同一行中所有数字都以空格分隔。
输出格式:
在一行中输出该树的层序遍历序列。所有数字都以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
8
91 71 2 34 10 15 55 18
输出样例:
18 34 55 71 2 10 15 91
解题
还是二叉树的遍历,这里要求输出层序遍历则需要用到bfs,而题目给出的是后序遍历(dfs)因此需要建树求出层序遍历,建树的关键是找出左右子树的节点个数,本题需利用完全二叉树的性质。
现在要找出完全二叉树中左子树的个数,假设完全二叉树T共有N个节点,即
- N左 + N右 = N - 1
开始左子树节点个数为0,然后
+ 1, + 2,+4,+8,+16,…,+,…
发现该规律,利用起来,一直加,直到所有子树节点加完,统计出左子树节点个数,再利用dfs遍历建树,最后bfs遍历树得到层序遍历。
代码
#include <algorithm> //L2-035 完全二叉树的层序遍历 (25分)
#include <iostream>
#include <queue>
#include <vector>
using namespace std;vector<int> back, num;typedef struct TNode {TNode *left, *right;int value;
} * Tree;Tree dfs(int l, int r, Tree T) { //建树if (l > r) return NULL;if (!T) T = new TNode();T->value = back[r];int A = 0; //记录左子树长度int len = 1; //单行的大小bool isLeft = true;int cnt = 0;for (int i = l; i < r; i++) {cnt++;if (isLeft) A++;if (cnt == len) { //记录完其中一条子树的一行时cnt = 0;if (!isLeft) len <<= 1; //如果记录一行最后一个isLeft = !isLeft;}}T->left = dfs(l, l + A - 1, T->left);T->right = dfs(l + A, r - 1, T->right);return T;
}void bfs(Tree T) {queue<Tree> q;q.push(T);while (!q.empty()) {Tree T = q.front();num.push_back(T->value);q.pop();if (T->left) q.push(T->left);if (T->right) q.push(T->right);}
}int main() {int N;cin >> N;back.resize(N);for (int i = 0; i < N; i++) cin >> back[i];Tree T = dfs(0, back.size() - 1, NULL);bfs(T);for (int i = 0; i < num.size(); i++) {if (i) cout << " ";cout << num[i];}cout << endl;system("pause");return 0;
}
PTA L2-035 完全二叉树的层序遍历(树的遍历)相关推荐
- java如何遍历树_java 遍历树的四种方式
java 遍历树的四种方式 最近做一个玫瑰图报表,数据源为TreeJson(树状json),在网上搜集下资料,和大家分享.: 先序遍历 中序遍历 后序遍历 层次遍历 public class Tree ...
- 树-树的遍历(先序、中序、后序)
树的遍历 树的遍历方式主要分为四种,先序.中序.后序和层序,在这篇博客中我将仔细介绍一下树的这四种遍历方式. 先序遍历 先序遍历,也叫先根遍历.前序遍历,首先访问根结点然后遍历左子树,最后遍历右子树. ...
- 【数据结构-树】1.树与森林(树的遍历、树的存储方法、并查集的实现)
树的定义 树是一种数据结构,它是由 n(n>=1)n(n>=1)n(n>=1) 个有限结点组成一个具有层次关系的集合.把它叫做 "树" 是因为它看起来像一棵倒挂的 ...
- PTA L2-006 树的遍历-二叉树的后序遍历+中序遍历,输出层序遍历 团体程序设计天梯赛-练习集...
L2-006 树的遍历 (25 分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤),是二叉树中结点的个 ...
- 【L2-035 完全二叉树的层序遍历】天梯赛L2详解
天梯赛L2-035 完全二叉树的层序遍历 题目详情: 思路: 利用完全二叉树的特点,直接进行递归即可. 完全二叉树的特点:假设根结点是a,那么他的左节点一定是2a,右节点一定是2a+1 详细代码: # ...
- 【2020团体程序设计天梯赛】L2-3 完全二叉树的层序遍历(后序遍历转层次遍历)
problem 7-11 完全二叉树的层序遍历 一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树.对于深度为 D 的,有 N 个结点的二叉树,若其结点对应于相同深度完美二叉树的 ...
- 完全二叉树的层序遍历(马老师的比赛心得)
L2-3 完全二叉树的层序遍历 (25分) ## 比赛的时候差一点就完成了,所以写个博客了却一下自己的遗憾. 一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树.对于深度为 D ...
- 完全二叉树的层序遍历游戏
"司马龙先生,又出现了一个新游戏的入口",司马龙先生旁边的头发乱糟糟的助手马代钧说到. "可恶.还是迟了一步吗?又给我们布下了一个谜题",司马龙如是说. &qu ...
- tree traversal (树的遍历) - 层序遍历 (level order traversal) - 二叉树的层序遍历
tree traversal (树的遍历) - 层序遍历 (level order traversal) - 二叉树的层序遍历 1. tree traversal (树的遍历) 1.1 深度优先搜索 ...
最新文章
- 机器学习——深度学习(Deep Learning)
- Unicode字符集下WriteFile中文处理
- ML:MLOps系列讲解之《MLOps的定义与发展—你为什么可能想使用机器学习》解读
- 会计期间13-16怎么用
- 百度Logo月度首页人物--王正华:中国低成本航空第一人
- canoco5主成分分析步骤_基于R语言的主成分分析
- 第七章:集成学习(利用AdaBoost元算法...)
- 【Python】Pandas在数据库中执行SQL语句并加载结果
- 6 个珍藏已久 IDEA 小技巧,这一波全部分享给你!
- String.Format数字格式化输出 {0:N2} {0:D2} {0:C2}
- 百度地图SDK使用注意其代理的处理
- linux 一句话备忘
- 照度计与亮度计的区别及如何挑选?
- 软件工程网络15个人阅读作业2(201521123111 陈伟泽)
- NanoHTTPD介绍
- 计算机网络 ping中ttl,ping命令TTL什么意思 ping值ttl多少算正常
- 日本地震波及芯片产业链致价格走势难料
- alt.js 使用教程
- 计算机内存和外存的主要特点,内存与外存的主要特点
- 计算机桌面锁在哪里设置,怎么设置电脑屏幕锁