PAT A1099 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.
PAT A1099 Build A Binary Search Tree (30分)_第1张图片

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

题意:

输入一颗二叉查找树的结点数n、各结点的左右孩子结点id、所有结点的权值序列origin[];输出该二叉查找树的层序序列.

思路:

(1)先依据条件构建一棵没有权值的二叉树Node[],再中序遍历该二叉树,按照中序遍历的顺序赋权值给对应的结点,构建出一颗二叉排序树;
(2)层序遍历该二叉排序树,求得层序序列并输出.

代码:

#include 
#include 
#include 
#include 
using namespace std;
const int maxn = 110;

struct node{//二叉排序树的静态存储结构 
	int data;
	int lchild,rchild;
}Node[maxn];

int n,origin[maxn],k = 0;//结点数n、结点权值序列origin[](非递减排序)、 
void inorder(int root){//中序遍历 
	if(root==-1) return;//递归边界 
	inorder(Node[root].lchild);
	Node[root].data = origin[k++];//按照中序遍历的顺序赋权值给对应的结点,即将权值写入二叉排序树 
	inorder(Node[root].rchild);
}

vector<int> layer;//layer[]存放二叉排序树的层序序列 
void layerorder(int root){//层序遍历 
	queue<int> q;
	q.push(root);
	while(!q.empty()){
		int now = q.front();
		q.pop();
		layer.push_back(Node[now].data);
		if(Node[now].lchild!=-1) q.push(Node[now].lchild);
		if(Node[now].rchild!=-1) q.push(Node[now].rchild);
	}
}

int main(){
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++) scanf("%d %d",&Node[i].lchild,&Node[i].rchild);
	for(int i=0;i<n;i++) scanf("%d",&origin[i]); 
	sort(origin,origin+n);//排序后的序列即为二叉排序树的中序序列
	inorder(0);//赋权值 
	layerorder(0);
	printf("%d",layer[0]);
	for(int i=1;i<n;i++) printf(" %d",layer[i]);
	return 0;
}

PS:

二叉查找树又名二叉搜索树、二叉排序树、排序二叉树.

你可能感兴趣的:(PAT甲级,PAT,程序设计,c++,算法,数据结构)