Рассмотрим: 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]
, что вызовет несколько рекурсивных вызовов.
Это много, чтобы написать/объяснить, но, надеюсь, это приведет вас к правильному пути. На бумаге должно быть проще следовать.
Я не отвечаю на вопрос. Что значит «визуализировать»? Кроме того, отсортированный список является продуктом обхода [in-order traversal] (http://en.wikipedia.org/wiki/Tree_traversal#Depth-first_traversal) в BST, таким образом, осуществляя обход по дереву в порядке, вы можете «заполнить его» элементами в отсортированном списке. Это будет «O (n)». Если у вас нет дерева, которое нужно заполнить, вы можете создать пустое полное дерево, а после этого - заполнить его, как было предложено. – amit
Я хочу, чтобы построить дно снизу вверх из отсортированного списка с ручкой и бумагой, как я могу легко сделать с нисходящим подходом. – SexyBeast