zoukankan      html  css  js  c++  java
  • PAT A1064 Complete Binary Search Tree [完全二叉搜索树]

    题目描述

    链接
    给一串构成树的序列,已知该树是完全二叉搜索树,求它的层序遍历的序列

    分析

    • 二叉搜索树的性质:左子树<根<右子树,而中序遍历是LDR,所以:中序遍历二叉搜索树得到的序列是从小到大排列的
    • 完全二叉树的性质:在数组中的存储顺序是层序遍历完全二叉树的顺序
    • 混淆概念:要唯一确定一棵二叉树,一般需要先后序中一个和中序一起。不存在什么中序遍历建立二叉树。根本就不唯一好吧。但是在这里,由于限定了完全二叉搜索树,则可以借助中序遍历来对数组赋值。
    • 将题目所给序列进行排序,得到中序遍历顺序。而中序遍历,实质是按照LDR访问根结点。我们可以把访问这个操作改成赋值(nodes[root]=a[len++]) ,从而得到数组中的存储顺序。最后进行输出该顺序,即为层序遍历顺序。
    • 总结:排序-->改造中序遍历程序,将访问变成赋值-->得到数组存储顺序-->得到层序遍历顺序
    • 完全二叉树:结点为空:(i>n) 结点为叶子:(2i>n)
    #include<bits/stdc++.h>
    using namespace std;
    
    const int maxn = 1e4+10;
    int nodes[maxn];
    int n,len;
    int a[maxn];
    
    void inorder(int root){
        if(root > n) return;
        inorder(2*root);
        nodes[root] = a[len++]; //将访问改成赋值
        inorder(2*root+1);
    }
    
    int main(){
        cin>>n;
        for(int i=0;i<n;i++) cin>>a[i];
        sort(a,a+n);
        inorder(1);
        for(int i=1;i<=n;i++){
            if(i==1) cout<<nodes[i];
            else cout<<" "<<nodes[i];
        }
        cout<<endl;
    
    }
    
  • 相关阅读:
    杯具的流浪狗
    数据加密与数据压缩后加密的效率
    XMPP协议自定义消息类型扩展
    have a try
    linux修改网卡名称的方法
    WARNING: old character encoding and/or character set解决办法
    extern用法总结
    linux下的c++线程池实现
    32位linux系统操作大于2G文件方法
    eclipse中gdb调试输出stl容器的内容
  • 原文地址:https://www.cnblogs.com/doragd/p/11280181.html
Copyright © 2011-2022 走看看