给定一个排序数组,以自上而下的方式从中可视化BST非常容易。例如,如果数组是[1,2,3,4,5,6,7]
,我们可以看到根将是中间元素,即4
。在其左侧将有一个子树,其根是4
左侧的数组切片的中间,即2
。同样,它也会在右边相似。
我们如何通过自下而上的方法来构建BST?基本上我试图理解从排序链表中构造BST的算法,它以自下而上的方式采用O(N)
,以自上而下的方式采用O(Nlog N)
。所以我需要了解它是如何建立自下而上的。
答案 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 = NULL
和parent = 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}},这将触发多个递归调用。
写/解释很多,但希望这能让你走上正轨。它应该更容易在纸上进行。