1064. Complete Binary Search Tree (30)

PAT-A1064,题目地址:https://www.patest.cn/contests/pat-a-practise/1064
对搜索树的中序遍历就是对数的排序;
将1作为complete二叉树的root,则每个节点的子节点都是父节点的的下标的2倍或者2倍+1;
思路:

  1. 对数组进行从小到大排序
  2. 对tree进行中序遍历,记录中序遍历的下标的顺序(以示例为例:8,4,9,2,10,5,1,6,3,7,注意根节点的下标为1假设)
  3. 还原树,将树存在数组中,则依次输出就是层序遍历的结果(6 3 8 1 5 7 9 0 2 4)

代码如下:

#include <cstdio>
#include <algorithm>

int main(){
    int count;
    int num[1002], res[1002];

    scanf("%d", &count);
    for(int i = 0; i < count; i++){
        scanf("%d", &num[i]);
    }
    std::sort(num, num + count);

    int first = 1; //first是中序遍历过程中第一个要访问的节点的下标
    while(first * 2 <= count){
        first *= 2;
    }
    int now = first, index = 0; // now代表中序遍历过程中正在访问的节点的下标
    while(1){ //进行中序遍历
        res[now] = num[index++];
        if(2 * now + 1 <= count){
            now = 2 * now + 1;
            while(2 * now <= count){
                now *= 2;
            }
        }
        else if(now % 2 == 0){
            now /= 2;
        }
        else{
            while(now % 2 == 1){
                now /= 2;
            }
            now /= 2;
        }
        if(now == 0){
            break;
        }
    }
//以下为结果输出
    for(int i = 1; i <= count; i++){
        if(i > 1){
            printf(" ");
        }
        printf("%d", res[i]);
    }
    printf("\n");
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 5,165评论 0 12
  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 4,489评论 1 31
  • 第一章 绪论 什么是数据结构? 数据结构的定义:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 第二章...
    SeanCheney阅读 5,822评论 0 19
  • LeetCode 刷题随手记 - 第一部分 前 256 题(非会员),仅算法题,的吐槽 https://leetc...
    蕾娜漢默阅读 17,934评论 2 36
  • K k)即使如此,当前的长计数周期冬至2012结束日期可能是玛雅天文技术的证据。玛雅天文观测站建成并通过观察夜空...
    数学系2班姚磊33阅读 264评论 0 0