1.题目描述
给你两棵二叉树 root
和 subRoot
。检验 root
中是否包含和 subRoot
具有相同结构和节点值的子树。如果存在,返回 true
;否则,返回 false
。
二叉树 tree
的一棵子树包括 tree
的某个节点和这个节点的所有后代节点。tree
也可以看做它自身的一棵子树。
示例:
输入:root = [3, 4, 5, 1, 2],subRoot = [4, 1, 2]
输出:true
2.题解
思路分析
我们首先判断两棵二叉树是否相同,若相同,则subRoot是root的子树;
若不相同,则判断root的左子树是否与subRoot是否相同,若相同,则subRoot是root的子树;
若不同,判断root的右子树是否与subRoot相同,若相同,subRoot是root的子树;
若不同,继续递归判断...
具体实现
1.首先实现判断两棵二叉树是否相同的代码:
(1)若两棵二叉树都为空,则两颗二叉树相同;若两颗二叉树中只有一棵树为空,则不同
(2)若两棵二叉树都不为空,再判断其根节点的值是否相同,若不相同,两棵二叉树不相同;若相同,再分别判断两颗二叉树的左子树是否相同,右子树是否相同。(通过递归实现)
具体过程:
代码实现:
public boolean isSameTree(TreeNode p, TreeNode q) { //都为null,相同 if(p == null && q == null){ return true; } //只有一个为null,不同 if(p == null|| q == null){ return false; } //都不为空,但值不为空,不同 if(p.val != q.val){ return false; } //判断两颗二叉树的左子树、右子树是否相同 return isSameTree(p.left,q.left) && isSameTree(p.right,q.right); }
2.判断subRoot是否为root子树
(1)若subRoot为空,则subRoot为root的子树,返回true
(2)若root为空,则subRoot不为root的子树。返回false
(1)判断subRoot是否与root相同
(2)判断subRoot是否是root的左子树
(3)判断subRoot是否是root的右子树
若都不相同,最后返回false
具体过程:
代码实现:
public boolean isSubtree(TreeNode root, TreeNode subRoot) { if(subRoot == null){ return true; } if(root == null) { return false; } //1、是不是和根节点相同 if(isSameTree(root,subRoot)) { return true; } //2、判断是不是root的左子树 if(isSubtree(root.left,subRoot)) { return true; } //3、右子树 if(isSubtree(root.right,subRoot)) { return true; } //4、返回 return false; }
完整代码
class Solution { public boolean isSameTree(TreeNode p, TreeNode q) { if(p == null && q == null){ return true; } if(p == null|| q == null){ return false; } if(p.val != q.val){ return false; } return isSameTree(p.left,q.left) && isSameTree(p.right,q.right); } public boolean isSubtree(TreeNode root, TreeNode subRoot) { if(subRoot == null){ return true; } if(root == null) { return false; } //1、是不是和根节点相同 if(isSameTree(root,subRoot)) { return true; } //2、判断是不是root的左子树 if(isSubtree(root.left,subRoot)) { return true; } //3、右子树 if(isSubtree(root.right,subRoot)) { return true; } //4、返回 return false; } }
题目来自: