[JSデータ構造とアルゴリズム]#記号[8,8,7,9,2、 '#'、 '#'、 '#'、 '#'の二分木のレベルトラバーサル結果に従って二分木を作成します、4,7]

序文

二分木の関連する操作を実現するには、単に配列やタイトルに示されているユースケースを使用するのではなく、二分木構造を作成する必要があります。

たとえば、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)

最終的な構造:
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_42339197/article/details/104252079