1064 Complete Binary Search Tree
大致题意就是给出一个包含 N个非负整数的序列,然后构造出一个既是完全二叉树又是二叉查找树的二叉树,然后输出其层序遍历序列。
想了想,其实题目问的是 如何向完全二叉树的每一个结点赋值。。。
第一步,必须知道完全二叉树的存储结构是一维数组CBT,其根结点是下标1,当前根结点root的左孩子是root*2、右孩子是root*2+1。
第二步,已知二叉查找树的中序遍历序列,可以通过中序遍历的方式,向完全二叉树的每个结点赋值,最后得到一个带权值的二叉树。
第三步,顺序遍历完全二叉树CBT,即为层序遍历序列。
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 5 const int maxn = 2000; 6 int n,in[maxn] = {0},CBT[maxn] = {0},index = 0; 7 void inorder(int root) { //中序遍历完全二叉树 8 if(root > n) return ;//空结点,直接返回 9 inorder(root*2); //往左子树递归 10 CBT[root] = in[index++]; 11 inorder(root*2+1);//往右子树递归 12 } 13 14 int main() { 15 cin>>n; 16 for(int i = 0; i < n; ++i) 17 cin>>in[i]; 18 sort(in,in+n); 19 inorder(1); //完全二叉树的根结点下标必须是 1 20 for(int i = 1; i<= n; ++i) { 21 if(i > 1) printf(" "); 22 printf("%d",CBT[i]); 23 } 24 return 0; 25 }