如何构建二进制搜索树自下而上

时间:2012-10-02 10:12:09

标签: algorithm linked-list binary-search-tree

给定一个排序数组,以自上而下的方式从中可视化BST非常容易。例如,如果数组是[1,2,3,4,5,6,7],我们可以看到根将是中间元素,即4。在其左侧将有一个子树,其根是4左侧的数组切片的中间,即2。同样,它也会在右边相似。

我们如何通过自下而上的方法来构建BST?基本上我试图理解从排序链表中构造BST的算法,它以自下而上的方式采用O(N),以自上而下的方式采用O(Nlog N)。所以我需要了解它是如何建立自下而上的。

1 个答案:

答案 0 :(得分:7)

考虑:http://www.leetcode.com/2010/11/convert-sorted-list-to-balanced-binary.html

BinaryTree* sortedListToBST(ListNode *& list, int start, int end) {
  if (start > end) return NULL;
  // same as (start+end)/2, avoids overflow
  int mid = start + (end - start) / 2;
  BinaryTree *leftChild = sortedListToBST(list, start, mid-1);
  BinaryTree *parent = new BinaryTree(list->data);
  parent->left = leftChild;
  list = list->next;
  parent->right = sortedListToBST(list, mid+1, end);
  return parent;
}

BinaryTree* sortedListToBST(ListNode *head, int n) {
  return sortedListToBST(head, 0, n-1);
}

让我们写出一些递归调用:

0 1 2 3 4 5 6 7 8 -> sortedListToBST(list, 0, 3) [A]
0 1 2 3           -> sortedListToBST(list, 0, 0) [B]
0                 -> sortedListToBST(list, 0, -1) [C]
*                 -> NULL [D]

[D]将返回NULL

现在,在[C]中,我们将leftChild = NULLparent = 0(列表中的第一个节点)。父母的左孩子将为NULL,并且列表会进行。然后,[C]会致电sortedListToBst(1, 0)NULL会返回parent,因此NULL的正确孩子也会 0 / \ null null 。到目前为止,您的树看起来像这样:

[B]

现在,这将返回到leftChild = 0 = the above中的左侧呼叫,[B]中的parent[B]中的1会将自己设置为 1 / 0 / \ null null (列表中的第二个节点,请注意我们在之前的调用中提升了列表头 - 列表是全局的/通过引用传递) 。它的左子项将设置为您在上一步中计算的内容(上面的树)。你的树现在看起来像这样:

2

列表再次提前,指向sortedListToBST(list, 2, 3)。将从[B]进行递归调用{{1}},这将触发多个递归调用。

写/解释很多,但希望这能让你走上正轨。它应该更容易在纸上进行。