多くの初心者と同じように、私の頭は再帰から吹き飛ばされます。SOに関する多くの回答/説明を調べました。しかし、私はまだコンセプトがはっきりしていません。(これは宿題ではありません。未学習のことを再学習しようとしていますが、再帰は文字列ポイントではありませんでした)
事前順序トラバーサルが与えられた場合、二分木を構築します。再帰では、一見単純でなければなりません:)しかし、私はそれを取得できません。
arr の順序は、ノードが挿入された順序でなければならないことがわかります。私を悩ませているのは:
- ノードにすでに左/右がある場合はどうなりますか? これはどのように作動しますか?
再帰はどのようにノードを挿入できますか?たとえば、次の事前順序で?
12, 10, 6, 13
15 がルート、5、3、および左
10 の左の子として 6 を正しく挿入するにはどうすればよいですか?
12
10 13
6*
スケルトンコードは次のとおりです。
main()
{
int[] arr = {};
//make the first node a root node.
node n = new node(arr[0]);
buildbst(n, arr, 0)
}
buildbst(node root, int[] arr, int i)
{
if (i == arr.length) return;
if (arr[i] < root.data)
root.left = new node (arr[i]);
else
root.right = new node(arr[i]);
buildbst(root.left, arr, i++);
buildbst(root.right, arr, i++);
}
編集:
再帰呼び出しを渡すと、buildbst(root.left, arr+i, i++)
それが正しい方法であることに気付きましたか? それとも、私はこれに完全に間違ったアプローチをしていますか - 動的プログラミングと再帰と分割と征服の寄せ集め...