リコウ筆問題集 day10 (木の部分構造+二分木画像+対称二分木)

ツリーの下部構造

2 つの二分木 A と B を入力し、B が A の部分構造かどうかを判断します。(空のツリーはどのツリーのサブ構造でもないことが合意されています)
B は A のサブ構造です。つまり、A は B と同じ構造とノード値を持ちます。

トピック

ここに画像の説明を挿入

一連の考え

dfs(A, B) 関数:
終了条件:
ノード B が空の場合: ツリー B が一致した (葉ノードを通過した) ことを意味するため、true を返す;
ノード A が空の場合: ツリー A の葉であることを意味しますノードが交差した、つまりマッチングに失敗した場合、false を返します;
ノード A と B の値が異なる場合: マッチングに失敗したことを意味し、false を返します;
戻り値:
AA と AA の左の子ノードかどうかを判断しますBB が等しい、つまり recur(A.left, B.left);
AA と BB を判断する 右側のサブノードが等しいかどうか、つまり recur(A.right, B.right);
isSubStructure(A, B ) 関数:
特別な場合の処理​​: 木 A が空または木 B が空の場合、直接 false を返す;
戻り値: 木 B が木 A の部分構造であり、次の 3 つの条件のいずれかを満たす必要がある場合、|| を使用します。接続する;
ノード AA をルート ノードとするサブツリーには、dfs(A, B) に対応するツリー BB が含まれます;
ツリー B は、ツリー A の左側のサブツリーの部分構造は、isSubStructure(A.left, B) に対応します; 部分
構造ツリー B の isSubStructure(A.right, B) に対応するツリー A の右側のサブツリーです。

コード

var isSubStructure = function (A, B) {
    
    
    if (A===null||B===null) return false;
    return dfs(A,B)||isSubStructure(A.left, B)||isSubStructure(A.right, B);
};
 function dfs(A,B) {
    
    
        if (B==null) return true;
        if (A==null) return false;
        return A.val===B.val&&dfs(A.left, B.left)&&dfs(A.right, B.right);
    }

二分木ミラーリング

二分木を入力として取り、その鏡像を出力する関数を完成させてください。

トピック

ここに画像の説明を挿入

一連の考え

二分木の左右のノードを入れ替える

コード

var mirrorTree = function(root) {
    
    
    if(root == null){
    
    
        return null
    }
    [[root.left,root.right]] = [[root.right,root.left]]
    mirrorTree(root.left)
    mirrorTree(root.right)
    return root
};

対称二分木

二分木が対称かどうかを判定する関数を実装してください。ミラー イメージと同じ場合、二分木は対称です。

トピック

ここに画像の説明を挿入

一連の考え

左右のノードを直接比較する

コード

var isSymmetric = root => {
    
    
   return isSymmetricCore(root, root)
}

var isSymmetricCore = (n1, n2) => {
    
    
    // 两个空结点
    if (!n1&&!n2) return true
    // 一个为空,一个不为空
    if (!n1||!n2) return false
    if (n1.val!==n2.val) return false
    return isSymmetricCore(n1.left, n2.right) && isSymmetricCore(n1.right, n2.left)
}

おすすめ

転載: blog.csdn.net/weixin_51610980/article/details/128437459