剑指 Offer 26. 树的子结构
题目描述
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如:
给定的树 A:
示例1
输入:A = [1,2,3], B = [3,1]
输出:false
示例2
输入:A = [3,4,5,1,2], B = [4,1]
输出:true
限制
0 <= 节点个数 <= 10000
思路
DFS
- 判别传入的参数中 B树中的节点是否为空 为空则返回 true就是说传入的节点已经是空的 有可能题目输入的B节点是空的 也有可能是已经到达B树的终点 所以返回 true
- 判断传入的A树节点是否为空 为空则表示与B树不匹配 返回false
- 如果当前A树节点的值与B树节点的值相等,说明此节点匹配继续 分别传入 A树B树左节点 和 A树B树右节点 继续搜索
- 注意:不一定A树的根节点作为对比的根节点(即B的根节点) A的左节点 和 右节点都有可能
代码
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} A
* @param {TreeNode} B
* @return {boolean}
*/
var isSubStructure = function(A, B) {
if(A=== null || B=== null) return false;
let dfs = function(node, B){
// 到达终点 或 B本就是为空
if(B === null) return true;
//A树的节点不匹配了
if(node === null) return false;
//A B树当前节点相等 继续搜索
if(node.val === B.val){
return dfs(node.left, B.left)&&dfs(node.right, B.right);
}
else{
return false;
}
}
// 更换对比的根节点
return dfs(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B);
};