ツリーの下部構造
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)
}