1099 Build A Binary Search Tree

大致题意就是给出 N个结点的左孩子结点下标、右孩子结点下标,然后构造一棵 静态二叉树。再给出一个包含N个整数的序列,把这些整数一 一填入这棵二叉树中,使其成为一棵二叉查找树,最后输出其层序遍历序列。

思路:

第一步,根据每个结点的左孩子下标、右孩子下标构造一棵二叉树;

第二步,把包含N个结点的整数序列按从小到大排序;

第三步,中序遍历这个二叉树,把整数一 一填入每个结点,最后得到一棵二叉查找树;

第四步,输出这个二叉查找树的层序遍历序列。

PS:类似1064 Complete Binary Search Tree,都要先构造出 二叉树的存储结构,然后根据中序遍历序列,通过中序遍历的方式为每一个结点赋值。

 1 #include<iostream>
 2 #include<queue>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 const int maxn = 200;
 7 struct Node {
 8     int data;
 9     int left ,right;
10 } node[maxn];
11 
12 int in[maxn],index = 0;
13 
14 void inorder(int root) { //中序遍历,构造二叉查找树
15     if(root == -1) return ; //叶子节点,直接返回
16     inorder(node[root].left);
17     node[root].data = in[index++];
18     inorder(node[root].right);
19 }
20 
21 int num = 0;
22 void levelorder(int root) {//层序遍历
23     //第一步,定义队列并入队
24     queue<int> que;
25     que.push(root);
26     //第二步,判断队列非空
27     while(!que.empty()) {
28         //第三步,访问队首元素并出队
29         int now = que.front();
30         if(num > 0) printf(" ");
31         printf("%d",node[now].data);
32         num++;
33         que.pop();
34         //第四步,下一层元素(左、右孩子)入队
35         if(node[now].left != -1) que.push(node[now].left);
36         if(node[now].right != -1) que.push(node[now].right);
37     }
38 }
39 
40 int main() {
41     int n;
42     cin>>n;
43     for(int i = 0; i < n; ++i) //构造二叉树
44         cin>>node[i].left>>node[i].right;
45     for(int i = 0; i < n; ++i)
46         cin>>in[i];
47     sort(in,in+n);//递增排序
48     inorder(0); //中序遍历
49     levelorder(0);//层序遍历
50     return 0;
51 }

 

posted @ 2020-03-03 19:09  tangq123  阅读(110)  评论(0编辑  收藏  举报