Complete Binary Search Tree (30)
时间限制
100 ms
内存限制
65536 kB
代码长度限制
16000 B
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.
左子树的节点只包含key值比他小的节点
- The right subtree of a node contains only nodes with keys greater than or equal to the node's key.
右子树的节点只包含key值比他大或者和它相等的节点
- Both the left and right subtrees must also be binary search trees.
左字树和右字树都是二叉排序树
A Complete Binary Tree (CBT) is a tree that is completely filled, with the possible exception of the bottom level, which is filled from left to right.
一个完全二叉排序树是一种完全满的树,可能有例外的就是最底层,它是从左到右排的。
Now given a sequence of distinct non-negative integer keys, a unique BST can be constructed if it is required that the tree must also be a CBT.
现在给一个连续的不重复的非负的整数值,如果要满足构造一个唯一的排序二叉树,那么这个树也一定满足完全二叉排序树。
You are supposed to output the level order traversal sequence of this BST.
要求你按照等级排序输出这个排序二叉树。
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (<=1000). Then N distinct non-negative integer keys are given in the next line. All the numbers in a line are separated by a space and are no greater than 2000.
每个输入文件包含一个测试案例。对于每个测试案例,第一行包含N<1000。下一行有N个不重复的非负整数。所有的数都在一行用空格分开,都不会超过2000。
Ouput Specification:
For each test case, print in one line the level order traversal sequence of the corresponding complete binary search 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:
10 1 2 3 4 5 6 7 8 9 0
Sample Output:
6 3 8 1 5 7 9 0 2 4
思考过程:
首先看到测试用例,先排序以下,把0拿到前面来
0 1 2 3 4 5 6 7 8 9
然后看输出,画出输出的树的样子
6
3 8
1 5 7 9
0 2 4
然后思考,无论它给的数据怎么样,最后排序完成之后,就和一组连续的数一样,所以任何问题都可以看做是0-n的一个连续数据
然后观察,这棵树的特点,怎么从连续的数,变成一棵树。
下面要考虑的是问题的条件,为什么完全排序二叉树只有唯一的一种可能性,能否尝试举出反例呢?看下面这个树
6
4 8
1 5 7 9
0 2 3
乍一看好像满足,左边小中间中右边大的关系,可是仔细观察就会发现,4这个节点的右边字树出现了3这个节点,在二叉排序树中,不允许出现这样的情况,右边字树的任何一点都必须大于这个根节点。
那么现在我们已经真的理解了规则,下面一步就是尝试把问题变小。
0-9我们找不出规律,那么就从0开始
下面说的都是类似0-9这种已经排序完成的情况。
如果一个数0,那么什么好说的。
两个数,比较两个数的大小,小的作为左字树。
三个数,比较三个数的大小,最小的作为左字树,最大的作为右字树,剩下的是根节点。
四个数,问题就出现了,因为我们要满足完全性,所以我们很自然想到,先把后面三个按照三个数的方法生成一棵树,最后一个树放在第三层的最左边
如: 2
1 3
0
五个数,如果找不到排的方式,那么就先排出来
3
1 4
0 2
六个数,
3
1 5
0 2 4
七个数
3
1 5
0 2 4 6
八个数
4
2 6
1 3 5 7
0
后面就不列举了,总之分析到这里,我想到两种思路。
1、想办法从0开始生成树,一个节点,一个节点往树里面加,加的同时去改变节点,使之能满足条件。
2、想办法分,找到类似中位数的方式,找到一个值,这个值左边的数和右边的数,均可以满足完全排序二叉树的规则,然后递归去处理。
但是确实两种方式均特别麻烦,第一种思路需要仔细分析生成的方式,如果没有查阅或者是提前学习二叉树生成的原理和方法的话自己想分析出来,还是比较吃力的。第二种思路,主要是找的那个值的分析比较麻烦,如何找到这样一个值,使之能满足条件呢?左边的数个数要满足多少,右边数要满足多少呢?
所以我暂时不想直接用这两种思路去实现,而想弄清楚二叉树的特性,然后再来解这道题。
所以明天会更新的不是这个的下篇,而是二叉树的特性,包含构造,查询,插入,删除等。