输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)。B是A的子结构, 即 A中有出现和B相同的结构和节点值。
思路
- 深度优先扫描二叉树
A,找到值与B的根节点的值相同的节点 - 找到之后:利用验证函数,去比对此时
A的左右子节点是否与B的左右子节点的值完全相同- 对比过程中只要出现不相同,表明当前B不为A的子结构
- 继续查找下一个与
B的根节点的值相同的节点,继续验证是否是子结构 - 。。。
- 直到扫描完所以
A的节点
代码
function isSubStructure(A, B) {
if (B === null || A === null) return false
function dfs(A, B) {
// 找到A中值与B的根节点的值 相同的节点
// 验证以此节点为根节点的子树是否与B子树值一一对应
if (A.val === B.val && checkIsSameStructure(A, B)) {
return true
}
return (A.left && dfs(A.left, B)) || (A.right && dfs(A.right, B)) || false
}
//
function checkIsSameStructure(A, B) {
if (B === null) {
return true
} else if (A === null) {
return false
}
// 值相同 继续比较
// 其他情况 退出比较
if (A.val === B.val) {
return (
checkIsSameStructure(A.left, B.left) &&
checkIsSameStructure(A.right, B.right)
)
} else {
return false
}
}
return dfs(A, B)
}