深入了解如何实现此递归BST解决方案

时间:2018-08-28 20:05:00

标签: algorithm recursion binary-search-tree

在破解编码面试中,这段代码创建了一个二进制搜索树,该树在给定排序(按升序排列)数组的情况下具有最小高度(平衡)。

Node createMinimalBST(int arr[]) {
 return createMinimalBST(array, 0, array.length - 1);
}

Node createMinimalBST(int arr[], int start, int end) {
 if (end < start) {
  return null;
 }

 int mid = (start + end) / 2;
 Node n = new Node(arr[mid]);
 n.left = createMinimalBST(arr, start, mid - 1);
 n.right = createMinimalBST(arr, mid + 1, end);
 return n;
}

我完全遵循此代码,但是我自己无法提出此解决方案。

具体来说,在示例输入中写出变量值之后,窍门似乎是开始应为<=结束。这样可以确保将数组值插入正确的位置,并终止空指针。但是,我真的为某人设法弄清楚并使用它编写此递归函数而感到惊讶。任何人都可以提供有关如何实现此解决方案的见识吗?

1 个答案:

答案 0 :(得分:3)

我将按以下方式解决此问题。我们需要建立一个BST。构造它的最明显的方法是首先选择根节点。我们如何选择呢?好吧,我们知道在BST中,左子树中的所有值都小于根值,而右子树中的所有节点都大于根值。但是我们还有另一个要求-BST应该保持平衡并具有最小高度。直观地,这意味着整棵树的左子树应与右子树具有相同的大小,并且它们的高度不应相差太大(通常不超过一)。现在,如何选择根值,以便大约一半的值在左子树中(小于根值)而另一半在右子树中(大于根值)?对所有值进行排序,然后选择中间值作为根值。足够方便的是,我们已经对值进行了排序。现在我们选择了根值,我们需要构造左子树和右子树。怎么做?可以看到,这两个问题实际上是我们开始时遇到的相同问题,因此我们在此处使用的逻辑适用。确实,我们有一个排序的数组(原始数组的左半部分),我们需要从中构造一个最小高度平衡的BST,以使整棵树成为一个最小高度平衡的BST(类似地,对于右半部分)。考虑原始数组的左半部分,并选择其中间值作为左子树的根(右子树的构建方法与此类似)。现在我们可以看到模式了,可以递归地进行操作,以确保一旦递归调用中的数组为空(由空数组构造的最小高度平衡的BST只是空指针),我们就返回null