1099. Build A Binary Search Tree (30)
2015-09-09 15:42
459 查看
题目链接:http://www.patest.cn/contests/pat-a-practise/1099
题目:
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:
Sample Output:
分析:
思路:首先把二叉排序树中的每个节点的左右子树的数目给统计好(递归),然后通过把数组中的数排序确定根节点的数值,再递归确定各子树中根节点的数值。这一题写递归写爽了。
AC代码:
截图:
——Apie陈小旭
题目:
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<cstdio> #include<stack> #include<iostream> #include<vector> #include<cstdio> #include<algorithm> #include<queue> using namespace std; struct Node{ int value; int lhs; int rhs; int lhs_num; int rhs_num; Node(int v, int l, int r):value(v),lhs(l),rhs(r),lhs_num(0),rhs_num(0){} Node() :lhs_num(0), rhs_num(0){} }buf[101]; int countChild(Node* root){//确定各节点的左右孩子数目 if (root->lhs != -1){ root->lhs_num = countChild(&buf[root->lhs]); } else root->lhs_num = 0; if (root->rhs != -1){ root->rhs_num = countChild(&buf[root->rhs]); } return root->lhs_num + root->rhs_num + 1; } void build(Node* root, int num[]){//递归构建树,我写递归可是一个好手哈 root->value = num[root->lhs_num]; if (root->lhs_num > 0) build(&buf[root->lhs], num); if (root->rhs_num > 0) build(&buf[root->rhs], num + root->lhs_num + 1); } void seqTraversal(Node* root){//层序遍历,用作最后输出用 queue<Node*>Q; Q.push(root); bool firstFlag = true;//用作格式化输出 while (!Q.empty()){ Node *front = Q.front(); Q.pop(); if (firstFlag){ firstFlag = false; cout << front->value; } else{ cout << " " << front->value; } if (front->lhs != -1) Q.push(&buf[front->lhs]); if (front->rhs != -1) Q.push(&buf[front->rhs]); } cout << endl; } int main(){ freopen("F://Temp/input.txt", "r", stdin); int n; int num[100]; cin >> n; for (int i = 0; i < n; ++i){ cin >> buf[i].lhs >> buf[i].rhs; } for (int i = 0; i < n; ++i){ cin >> num[i]; } sort(num, num + n); countChild(buf); build(buf, num); seqTraversal(buf); return 0; }
截图:
——Apie陈小旭
相关文章推荐
- UIBezierPath贝塞尔弧线常用方法记
- iosUI—CALayer
- Android开发——异步更新UI的四种方式
- UISearchBar 背景 边框设置
- View requires API level 11 (current min is 8): <CalendarView>
- A potentially dangerous Request.Path value was detected from the client 异常
- 使用代码和storyboard分别创建UITabBarController
- The differences between String, StringBuffer and StringBuilder
- UIScrollView 滚动停止的时候一次调用此方法
- 【Android UI】 Shape详解 (GradientDrawable)
- UIView的layoutSubviews和drawRect方法何时调用
- UEditor扩展又拍云图片存储功能实践
- sort 升序还是降序?priority_queue 大根堆还是小根堆?
- J2msi 自己制作的把exe打成安装包简易GUI程序
- UIBezierPath画圆弧的记录
- UIBezierPath 使用
- java图形界面gui
- UICollectionView详解三
- UICollectionView详解二
- fix an error while building native gdb via ct-ng