1043 Is It a Binary Search Tree (25 分)
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.
If we swap the left and right subtrees of every node, then the resulting tree is called the Mirror Image of a BST.
Now given a sequence of integer keys, you are supposed to tell if it is the preorder traversal sequence of a BST or the mirror image of a BST.
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (≤1000). Then N integer keys are given in the next line. All the numbers in a line are separated by a space.
Output Specification:
For each test case, first print in a line YES
if the sequence is the preorder traversal sequence of a BST or the mirror image of a BST, or NO
if not. Then if the answer is YES
, print in the next line the postorder traversal sequence of that tree. All the numbers in a line must be separated by a space, and there must be no extra space at the end of the line.
Sample Input 1:
1 | 7 |
Sample Output 1:
1 | YES |
Sample Input 2:
1 | 7 |
Sample Output 2:
1 | YES |
Sample Input 3:
1 | 7 |
Sample Output 3:
1 | NO |
作者: CHEN, Yue
单位: 浙江大学
时间限制: 400 ms
内存限制: 64 MB
代码长度限制: 16 KB
题目大意
给出一颗树的前序遍历,求他是否为一颗二叉排序树(或镜像二叉排序树)。如是,则输出该二叉排序树的后序遍历。
分析
分成两个部分解决:
- 判断是否为二叉排序树。
isbnry
函数判断s到e范围内是否为一颗二叉排序树。根据前序遍历性质,第一个结点为根结点,扫描第一个大于等于根结点的数,此数左边为左子树,右边(包括他自己)为右子树。判断右子树中,是否有小于根结点的数,如有,那必不为二叉排序树。然后,递归判断左右子树是否都为二叉排序树。判断镜像二叉树ismbnry
与此类似,只不过大小关系相反。 - 输出后序遍历。参考Find postorder traversal of BST from preorder traversal,大意是通过控制一个区间(minval,maxval),判断当前结点是否位于此区间内。是的话说明它是相应树的子结点。转化为了普通的树求后序方法。同样需要两个版本,输出常规的和镜像的
代码
1 |
|