【发布时间】:2017-12-05 05:49:59
【问题描述】:
我目前正在检查编码算法。如果我们有以下情况:
给定一个具有唯一整数元素的排序(递增顺序)数组,编写一个算法来创建具有最小高度的二叉搜索树。
建议使用以下代码作为解决方案:
TreeNode createMinimalBST(int arr[], int start, int end){
if (end < start) {
return null;
}
int mid = (start + end) / 2;
TreeNode n = new TreeNode(arr[mid]);
n.setLeftChild(createMinimalBST(arr, start, mid - 1));
n.setRightChild(createMinimalBST(arr, mid + 1, end));
return n;
}
TreeNode createMinimalBST(int array[]) {
return createMinimalBST(array, 0, array.length - 1);
}
但如果我尝试使用以下数组输入代码:
[2,4,6,8,10,20]
我执行第一次迭代
createMinimalBST([2,4,6,8,10,20], 0, 5);
下面一行:
int mid = (start + end) / 2; // in Java (0 + 5) / 2 = 2;
将计算中间值作为二叉搜索树的根,位置编号为 2,即值为 6。
但是,此示例中的二叉搜索树应如下所示:
8
/ \
4 10
/ \ \
2 6 20
代码来自信誉良好的来源,但我的直觉是实现不正确。
是我遗漏了什么还是实现不正确?
【问题讨论】:
-
end 应该是数组的长度。是吗?
-
代码中end的值是正确的(根据提供的解决方案)
array.length - 1 -
可以修改公式计算
mid。如果end-start+1是奇数,则为mid = (start+end)/2,否则为mid = (start + end)/2 + 1。另外,能否分享一下出处的链接? -
@GAURANGVYAS 来源是一本书,名为《Cracking the Coding Interview》(第 6 版)。解决方案在第 242 页。