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

PAT 1099-Build A Binary Search Tree (30)

2017-03-01 12:47 453 查看


题目描述

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.




输入描述:

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.


输出描述:

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.


输入例子:

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



输出例子:

58 25 82 11 38 67 45 73 42


解题思路

一道基本的二叉搜索树问题,先中序遍历将二叉树构建完成,然后层次遍历输出。

#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
struct TreeNode
{
int key;
int Left;
int Right;
};
vector<int> keys;
struct TreeNode nodes[100];
void BuildTree(TreeNode node, int index);
void PrintTree(TreeNode node);
int main()
{
int N;
cin >> N;
keys.resize(N);
for (int i = 0; i < N; i++)
cin >> nodes[i].Left >> nodes[i].Right;
for (int i = 0; i < N; i++)
cin >> keys[i];
sort(keys.begin(), keys.begin() + N);
BuildTree(nodes[0],0);
PrintTree(nodes[0]);
}
void BuildTree(TreeNode node, int index)
{
if (node.Left != -1)
BuildTree(nodes[node.Left],node.Left);
nodes[index].key = keys.front();
keys.erase(keys.begin());
if (node.Right != -1)
BuildTree(nodes[node.Right],node.Right);
}
void PrintTree(TreeNode node)
{
queue<TreeNode> Q;
TreeNode temp;
Q.push(node);
while (!Q.empty())
{
temp = Q.front();
Q.pop();
if (temp.Left != -1)
Q.push(nodes[temp.Left]);
if (temp.Right != -1)
Q.push(nodes[temp.Right]);
if (Q.empty())
cout << temp.key;
else
cout << temp.key << " ";
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 PAT