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 完全二叉树的层序遍历(树的遍历)相关推荐

  1. java如何遍历树_java 遍历树的四种方式

    java 遍历树的四种方式 最近做一个玫瑰图报表,数据源为TreeJson(树状json),在网上搜集下资料,和大家分享.: 先序遍历 中序遍历 后序遍历 层次遍历 public class Tree ...

  2. 树-树的遍历(先序、中序、后序)

    树的遍历 树的遍历方式主要分为四种,先序.中序.后序和层序,在这篇博客中我将仔细介绍一下树的这四种遍历方式. 先序遍历 先序遍历,也叫先根遍历.前序遍历,首先访问根结点然后遍历左子树,最后遍历右子树. ...

  3. 【数据结构-树】1.树与森林(树的遍历、树的存储方法、并查集的实现)

    树的定义 树是一种数据结构,它是由 n(n>=1)n(n>=1)n(n>=1) 个有限结点组成一个具有层次关系的集合.把它叫做 "树" 是因为它看起来像一棵倒挂的 ...

  4. PTA L2-006 树的遍历-二叉树的后序遍历+中序遍历,输出层序遍历 团体程序设计天梯赛-练习集...

    L2-006 树的遍历 (25 分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤),是二叉树中结点的个 ...

  5. 【L2-035 完全二叉树的层序遍历】天梯赛L2详解

    天梯赛L2-035 完全二叉树的层序遍历 题目详情: 思路: 利用完全二叉树的特点,直接进行递归即可. 完全二叉树的特点:假设根结点是a,那么他的左节点一定是2a,右节点一定是2a+1 详细代码: # ...

  6. 【2020团体程序设计天梯赛】L2-3 完全二叉树的层序遍历(后序遍历转层次遍历)

    problem 7-11 完全二叉树的层序遍历 一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树.对于深度为 D 的,有 N 个结点的二叉树,若其结点对应于相同深度完美二叉树的 ...

  7. 完全二叉树的层序遍历(马老师的比赛心得)

    L2-3 完全二叉树的层序遍历 (25分) ## 比赛的时候差一点就完成了,所以写个博客了却一下自己的遗憾. 一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树.对于深度为 D ...

  8. 完全二叉树的层序遍历游戏

    "司马龙先生,又出现了一个新游戏的入口",司马龙先生旁边的头发乱糟糟的助手马代钧说到. "可恶.还是迟了一步吗?又给我们布下了一个谜题",司马龙如是说. &qu ...

  9. tree traversal (树的遍历) - 层序遍历 (level order traversal) - 二叉树的层序遍历

    tree traversal (树的遍历) - 层序遍历 (level order traversal) - 二叉树的层序遍历 1. tree traversal (树的遍历) 1.1 深度优先搜索 ...

最新文章

  1. 机器学习——深度学习(Deep Learning)
  2. Unicode字符集下WriteFile中文处理
  3. ML:MLOps系列讲解之《MLOps的定义与发展—你为什么可能想使用机器学习》解读
  4. 会计期间13-16怎么用
  5. 百度Logo月度首页人物--王正华:中国低成本航空第一人
  6. canoco5主成分分析步骤_基于R语言的主成分分析
  7. 第七章:集成学习(利用AdaBoost元算法...)
  8. 【Python】Pandas在数据库中执行SQL语句并加载结果
  9. 6 个珍藏已久 IDEA 小技巧,这一波全部分享给你!
  10. String.Format数字格式化输出 {0:N2} {0:D2} {0:C2}
  11. 百度地图SDK使用注意其代理的处理
  12. linux 一句话备忘
  13. 照度计与亮度计的区别及如何挑选?
  14. 软件工程网络15个人阅读作业2(201521123111 陈伟泽)
  15. NanoHTTPD介绍
  16. 计算机网络 ping中ttl,ping命令TTL什么意思 ping值ttl多少算正常
  17. 日本地震波及芯片产业链致价格走势难料
  18. alt.js 使用教程
  19. 计算机内存和外存的主要特点,内存与外存的主要特点
  20. 计算机桌面锁在哪里设置,怎么设置电脑屏幕锁

热门文章

  1. 忽略pdf换行符直接翻译的软件——copytranslator
  2. 羽毛球常见运动损伤及如何预防
  3. 《城市规划》(清华谭纵波著)读书笔记之第一部分
  4. 使用js将div高度设置为一直保持100%
  5. linux运维制度,Linux运维工作分类
  6. REST风格基础知识
  7. 众安在线“翻红”:保险科技龙头的强输出
  8. dell P2415Q输出4k
  9. 新华书店网上售书系统
  10. kubernetes1.22 helm ingress-nginx 使用笔记