26.树的子结构
面试题26. 树的子结构
难度中等37
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如:
给定的树 A:
3 / 4 5 / 1 2
给定的树 B:
4 / 1
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。
示例 1:
输入:A = [1,2,3], B = [3,1] 输出:false
思路:
//1.若A的根节点和B的根节点相同,则递归调用
// a.终止条件 b == null 说明b遍历完毕 返回true
// b.a == null a.val != b.val 说明a树遍历结束没有找到b的开始根节点
// c.递归调用a的左节点和b的左节点 或者a的右节点 和 b的右节点
//2.调用A的做节点和B子树比较 重复上述步骤
//3.A的右节点和B子树比较 重复1
时间复杂度:O(MN)
空间复杂度:O(M)
//1.若A的根节点和B的根节点相同,则递归调用
// a.终止条件 b == null 说明b遍历完毕 返回true
// b.a == null a.val != b.val 说明a树遍历结束没有找到b的开始根节点
// c.递归调用a的左节点和b的左节点 或者a的右节点 和 b的右节点
//2.调用A的做节点和B子树比较 重复上述步骤
//3.A的右节点和B子树比较 重复1
public boolean isSubStructure(TreeNode A, TreeNode B) {
return (A != null && B != null ) && (recur(A,B) || isSubStructure(A.left,B) || isSubStructure(A.right,B));
}
private boolean recur(TreeNode a,TreeNode b){
if(b == null) return true;
if(a == null || a.val != b.val) return false;
return recur(a.left,b.left) && recur(a.right,b.right);
}