今年(2017)腾讯暑期实习生招聘笔试感觉好难,题目分两个部分总共2个小时,第一部分是30道不定项选择题,第二部分包含2道简答题和2道编程题,
第一道编程题做了一半,没完全写出来,现在有时间总结一下:
题目:一颗满二叉排序树,节点值范围为:1~2^(N-1),给定三个子节点,求最大的公共父节点;
如输入层数N=4,子节点11,13,15; 则输出:12
分析
解决这道题的关键,主要是要清晰的知道二叉排序树的性质:左节点的值小于父节点的值,右节点值大于父节点的值。
当N=4时,共有15个节点对应的满二叉排序树为(可利用二分法从上到下建立二叉排序树):;
可以知道有以下性质:
- 以8为根节点,在左子树中一直往右走,可以找到左子树的最大值7,比根节点小1;
- 右子树一直往左走,可以找到右子树的最小值9,比根节点大1;
- 根节点的值是最左端的值和最右端的值之和的一半。
我们可以这样找最大的公共父结点(可以用分治法):
- 如果输入的结点在根结点的两边,则最大公共父结点必然是根结点,直接返回根结点;
- 如果输入的结点都在根结点的左边,往左子树遍历,更新根结点的值,利用性质1 & 3,得到新树的最右结点及根结点的值;
- 如果输入的结点都在根结点的右边,往右子树遍历,更新根结点的值,利用性质2 & 3,得到新树的最左结点及根结点的值;
- 重复2.3步骤,直到出现1情况,结束。
实现代码
实现方法1是实现题目要求的,只输入层数N和3个子结点值,得到最大公共父结点;
实现方法2是扩展的,具有更好的通用性,输入层数N、子结点个数n及子结点的值,得到最大公共父结点。
实现方法1
|
|
实现方法2
|
|