序文
二分木の関連する操作を実現するには、単に配列やタイトルに示されているユースケースを使用するのではなく、二分木構造を作成する必要があります。
たとえば、Jianzhiのオファーでは次のようになります。二分木の下部構造の
説明
2つの二分木AとBを入力して、BがAの下部構造であるかどうかを判別します。(追記:空のツリーはどのツリーの下部構造でもないことに同意します)
ユースケース:
{
8,8,7,9,2,#,#,#,#,4,7},{
8,9,2}
対応する出力は次のようになります。
true
二分木の要素はユースケースに応じて与えられますが、特定の構造は与えられていません。問題を解決する前に、二分木の構造を理解する必要があります。
{8,8,7,9,2,#,#,#,#,4,7}
実際、それは二分木の階層をトラバースした結果です。これ#
は空のノードを表します。最終的な構造は次のようになります。
配列の[8,8,7,9,2,#,#,#,#,4,7]
場合、配列は標準の二分木構造であり、対応するインデックス
は、ノード配列についての標準値に従って、#
追加、つまり完全な二分木であるかどうかを簡単に確認できます。ルールを描画できます。
- 現在のノードの配列添え字値がインデックスの場合
- 現在のノードの左側のノード----- >>インデックス* 2 + 1
- 現在のノードの右側のノード----- >>インデックス* 2 + 2
建設のアイデア:
- 配列の最初の要素を渡します。そうでない
#
(空の)場合は、この要素をルートノードとして使用します - ルートノードの左側の子ノードは再帰的に渡されます
index * 2 + 1
- ルートノードの左側の子ノードは再帰的に渡されます
index * 2 + 2
- 渡されたインデックス値が配列の長さ以上の場合、作成されたバイナリツリーであるルートノードが返されます。
function TreeNode(val) {
this.val = val;
this.left = null;
this.right = null;
}
function create(index, data) {
var p = null;
if (index >= data.length) return p;
if (data[index] != '#') {
p = new TreeNode(data[index]);
p.left = create(index * 2 + 1, data);
p.right = create(index * 2 + 2, data);
}
return p;
}
テストコード
var arr = [8, 8, 7, 9, 2, '#', '#', '#', '#', 4, 7];
var tree = create(0, arr);
console.log(tree)
最終的な構造: