您的位置:首页 > 产品设计 > UI/UE

1099 Build A Binary Search Tree

2016-02-26 12:54 465 查看
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

解题思路:首先根据输入构件一棵二叉树,对输入的数据进行从小到大排序,然后对二叉树进行先序遍历,将节点的编号与排序之后的数据的排序号进行一一对应,最后层次遍历输出。

#include<iostream>
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
struct node{
int num;
int left;
int right;
};
node arr[105];
int ans[105];
int coun = 1;
void sortTree(int root){
if (root == -1){
return;
}
int left = arr[root].left;
int right = arr[root].right;
sortTree(left);
ans[root] = coun;
coun++;
sortTree(right);
}
int main(){
for (int n; scanf("%d", &n) != EOF;){
vector<int> nums(n);
coun = 1;
for (int i = 0; i < n; i++){
scanf("%d%d", &arr[i].left, &arr[i].right);
arr[i].num = i;
}
for (int i = 0; i < n; i++){
scanf("%d", &nums[i]);
}
sort(nums.begin(), nums.end());
sortTree(0);
queue<int>que;
printf("%d", nums[ans[0] - 1]);
if (arr[0].left != -1){
que.push(arr[0].left);
}
if (arr[0].right != -1){
que.push(arr[0].right);
}
while (!que.empty()){
int temp = que.front();
que.pop();
int left = arr[temp].left;
int right = arr[temp].right;
if (left != -1){
que.push(left);
}
if (right != -1){
que.push(right);
}
printf(" %d", nums[ans[temp]-1]);
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: