1064. Complete Binary Search Tree 解析

来源:互联网 发布:手动安装windows补丁 编辑:程序博客网 时间:2024/04/20 09:27

参考了 http://blog.csdn.net/iaccepted/article/details/20726067 的思想

这个题很好的利用了树的的各种性质,很值得琢磨。

首先:完全二叉树 放在以1为开始编号的数组中满足

左孩子的编号 = root编号*2;

右孩子的编号 = root编号*2+1;

而且按数组顺序输出直接就是层序遍历的顺序。

其次:二叉搜索树的中序序列就是顺序排序。

有了这两个性质就能很快的解决这个问题。

#include <iostream>#include <algorithm>#include <cstring>#include <climits>#include <string>#include <map>#include <stack>#include <queue>#include <set>#define MAX 1010using namespace std;int n ;int list[MAX],ans[MAX];int pos = 1;void build(int root){if(root > n)return;int l = 2 * root ,r = 2*root + 1;build(l);ans[root] = list[pos++];build(r);}int main(){scanf("%d",&n);for(int i =1 ; i <= n;i++){scanf("%d",&list[i]);}sort(&list[1],&list[1]+n);build(1);printf("%d",ans[1]);for(int i = 2 ;i <= n ;i++)printf(" %d",ans[i]);printf("\n");return 0;}