検討してください: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
in[B]
はそれ自体をに設定します(1
リストの2番目のノード、前の呼び出しでリストヘッドを進めたことに注意してください-リストはグローバル/参照によって渡されます)。その左の子は、前のステップ(上のツリー)で計算したものに設定されます。これで、ツリーは次のようになります。
1
/
0
/ \
null null
リストは再び進み、を指してい2
ます。から再帰呼び出しsortedListToBST(list, 2, 3)
が行われ[B]
、複数の再帰呼び出しがトリガーされます。
書く/説明することはたくさんありますが、うまくいけば、これはあなたを正しい軌道に乗せることができます。紙の上でフォローする方が簡単なはずです。