1099. Build A Binary Search Tree (30)
A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:
- The left subtree of a node contains only nodes with keys less than the node's key.
- The right subtree of a node contains only nodes with keys greater than or equal to the node's key.
- Both the left and right subtrees must also be binary search trees.
Given the structure of a binary tree and a sequence of distinct integer keys, there is only one way to fill these keys into the tree so that the resulting tree satisfies the definition of a BST. You are supposed to output the level order traversal sequence of that tree. The sample is illustrated by Figure 1 and 2.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (<=100) which is the total number of nodes in the tree. The next N lines each contains the left and the right children of a node in the format "left_index right_index", provided that the nodes are numbered from 0 to N-1, and 0 is always the root. If one child is missing, then -1 will represent the NULL child pointer. Finally N distinct integer keys are given in the last line.
Output Specification:
For each test case, print in one line the level order traversal sequence of that tree. All the numbers must be separated by a space, with no extra space at the end of the line.
Sample Input:9 1 6 2 3 -1 -1 -1 4 5 -1 -1 -1 7 -1 -1 8 -1 -1 73 45 11 58 82 25 67 38 42
Sample Output:58 25 82 11 38 67 45 73 42
-
【自己写的没有AC的代码】
-
我的想法比较暴力:先序建树;数组排序;中序填数;层序输出
-
#include <iostream> using namespace std; #include <vector> #include <algorithm> #include <queue> vector<int> arr;//值组 int n; int value;//赋值时用 int i; struct Node{ int data; int lchild; int rchild; }; typedef struct Node Node; void PreOrderTravel(Node* bst,int index){ if(index!=-1){ cin>>bst[index].lchild>>bst[index].rchild; PreOrderTravel(bst,bst[index].lchild); PreOrderTravel(bst,bst[index].rchild); }else return; } void InOrderTravel(Node* bst,int index){ if(bst[index].lchild!=-1){//左到头 InOrderTravel(bst,bst[index].lchild); } bst[index].data=arr[value++]; if(bst[index].rchild!=-1){ InOrderTravel(bst,bst[index].rchild); } } void LevelOrderTravel(Node* bst){ queue<Node> q; Node node=bst[0]; q.push(node); while(!q.empty()){ node=q.front(); q.pop(); cout<<node.data; if(++i!=n){ cout<<" "; } if(node.lchild!=-1){ q.push(bst[node.lchild]); } if(node.rchild!=-1){ q.push(bst[node.rchild]); } } } int main(){ cin>>n; Node* bst=new Node[n];//顺序表存储 PreOrderTravel(bst,0);//先序建树 int a; for(int i=0;i<n;i++){ cin>>a; arr.push_back(a); } sort(arr.begin(),arr.end());//对数进行排序 value=0; InOrderTravel(bst,0);//中序填数 i=0; LevelOrderTravel(bst);//层序输出 system("pause"); }
-
测试点
测试点 结果 用时(ms) 内存(kB) 得分/满分 0 答案正确 3 384 18/18 1 答案错误 3 384 0/3 2 答案正确 2 384 3/3 3 答案正确 2 384 1/1 4 答案错误 3 384 0/5 -
【据说AC的代码】
#include <iostream> #include <algorithm> #include <queue> using namespace std; int Left[105]; int Right[105]; int a[105]; int b[105]; void DFS(int now ,int &x){ if(now < 0) return; DFS(Left[now],x); b[now] = a[x++]; DFS(Right[now],x); } int main(){ int N ; cin >> N; for(int i = 0; i < N ; i ++){ cin >> Left[i] >> Right[i]; } for(int i = 0; i < N ; i ++){ cin >> a[i]; } sort(a,a+N); int n = 0; DFS(0,n); queue<int> q; q.push(0); vector<int> answer; while(!q.empty()){ int node = q.front(); q.pop(); answer.push_back(b[node]); if(Left[node] != -1) q.push(Left[node]); if(Right[node] != -1) q.push(Right[node]); } for(int i = 0; i < answer.size(); i ++){ cout << answer[i] << (i == answer.size() - 1?"":" "); } return 0; }