原题
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
大体题意
给定二叉搜索树的结构以及一串序列,要求将序列中的数添入结点中
根是0,最后输出树的层序遍历
思路
因为是二叉搜索树,所以树的中序遍历是从小到大排序的一组数
所以将位子中序遍历保存后,将已经排序过后的数一一对应即可找到位置
最后再层序遍历输出结点的值即可
这里使用输出保存树的结点,结点的结构体为值、位置、左右孩子的位置
typedef struct node
{
int data;
int place;
int lchild;
int rchild;
}node;
代码
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>
#include <queue>
typedef struct node
{
int data;
int place;
int lchild;
int rchild;
}node;
int n;
node tree[110];
int a[110];
vector<int>pre;
void preorder(int index)
{
if (tree[index].lchild != -1)
preorder(tree[index].lchild);
if (0 <= index && index < n)
pre.push_back(index);
if (tree[index].rchild != -1)
preorder(tree[index].rchild);
}
void levelorder()
{
int temp;
queue<int>que;
que.push(0);
while (!que.empty())
{
temp = que.front();
if (temp != 0)
cout << " " << tree[temp].data;
else
cout << tree[temp].data;
que.pop();
if (tree[temp].lchild != -1)
que.push(tree[temp].lchild);
if (tree[temp].rchild != -1)
que.push(tree[temp].rchild);
}
}
bool cmp(int a, int b)
{
return a < b;
}
int main()
{
cin >> n;
int lchild, rchild;
for (int i = 0; i < n; i++)
{
cin >> lchild >> rchild;
tree[i].place = i;
tree[i].lchild = lchild;
tree[i].rchild = rchild;
}
for (int i = 0; i < n; i++)
cin >> a[i];
sort(a, a + n, cmp);
//for (int i = 0; i < n; i++)
// cout << a[i] << " ";
//cout << endl;
preorder(0);
//for (int i = 0; i < pre.size(); i++)
// cout << pre[i] << " ";
//cout << endl;
for (int i = 0; i < n; i++)
tree[pre[i]].data = a[i];
//for (int i = 0; i < n; i++)
// cout << tree[i].data << " ";
//cout << endl;
levelorder();
return 0;
}