完全二叉树的层序遍历c++

借鉴的文章

利用完全二叉树的遍历确定完全二叉树

题目

输入样例:

8
91 71 2 34 10 15 55 18

输出样例:

18 34 55 71 2 10 15 91
思路

完全二叉树具有这样的性质:

该图来源的文章:天梯赛 L2-3 完全二叉树的层序遍历 - a-shy-coder - 博客园 (cnblogs.com)

第一步:构建二叉树

利用完全二叉树的这一性质:编号为i的结点如果有左孩子那么左孩子编号为2*i,如果有右孩子那么右孩子编号为2*i+1。我们先按照后序遍历的方式递归构建一颗空的二叉树,每一个节点放到数组中,以便快速找到子结点:

1. 先构建出最大的左子树,然后先往新构建的结点填数,再往早一些构建的结点填数……

2. 再构建出最大的右子树,然后先往新构建的结点填数,再往早一些构建的结点填数……


3. 最后往根结点填数

这其实就是获得后序遍历的逆过程,获得后序遍历你要先找到最“左边”的结点,比如上图的值为D的结点,然后把这个数拿出来放到层序遍历的结果中,然后找到最“左边”的结点的兄弟节点E,把其放到层序遍历的结果中……直到把所有数拿完放到层序遍历的结果中。
 

第二步:输出二叉树

由于这颗二叉树是利用完全二叉树的性质构建的,一颗树中的结点从上到下,从左到右结点编号越来越大,我们是利用数组创建的结点,下标可以表示结点编号,因此只需顺序输出数组的元素即为层序遍历的结果。

代码
#include<bits/stdc++.h>
using namespace std;
int n;
int a[40];
void buildTree(int u)
{
    if (u > n) return ;
    if(2*u <= n) buildTree(2*u);
    if(2*u + 1 <= n)buildTree(2*u + 1);
    cin >> a[u];
}

int main()
{
    cin >> n;
    buildTree(1);

    for (int i = 1; i <= n; i ++)
        if(i == 1) cout << a[i];
        else cout << " " << a[i];
    return 0;
}

相关推荐

  1. 7-11完全

    2024-04-07 05:04:01       13 阅读
  2. 102.

    2024-04-07 05:04:01       30 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-07 05:04:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-07 05:04:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-07 05:04:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-07 05:04:01       18 阅读

热门阅读

  1. 【Linux】05.部署Microsoft SQL Server

    2024-04-07 05:04:01       18 阅读
  2. 我的创作纪念日

    2024-04-07 05:04:01       17 阅读
  3. MySQL里面慢查询优化指南:从定位到优化

    2024-04-07 05:04:01       18 阅读
  4. PostCSS安装以及使用详解

    2024-04-07 05:04:01       22 阅读
  5. HART报文详解

    2024-04-07 05:04:01       17 阅读
  6. Redis的String详细介绍

    2024-04-07 05:04:01       20 阅读
  7. 【算法】排硬币

    2024-04-07 05:04:01       19 阅读
  8. 互联网面经

    2024-04-07 05:04:01       21 阅读
  9. 从石膏像到真人:素描的进步之路

    2024-04-07 05:04:01       25 阅读
  10. 【leetcode】零钱兑换

    2024-04-07 05:04:01       20 阅读
  11. vue3 实现 input 输入框聚焦

    2024-04-07 05:04:01       22 阅读