![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4ecd32dbac1db4020e962d59c6f17bc7.jpeg)
题目
给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。
二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。
示例 1:
输入:root = [3,4,5,1,2], subRoot = [4,1,2]
输出:true
示例 2:
输入:root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2]
输出:false
提示:
root 树上的节点数量范围是 [1, 2000]
subRoot 树上的节点数量范围是 [1, 1000]
-104 <= root.val <= 104
-104 <= subRoot.val <= 104
思路
- 首先把问题简单化一下,如何判断两个树是否相等?只需满足三个条件:
- 一是根节点值相等
- 二是左子树相等
- 三是右子树相等
- 然后回到本题,如何判断树s是t的子树?只需下面三个条件满足其一即可:
- 两棵树相等
- s的左子树等于t
- s的右子树等于t
- 根据上面的分析,使用递归比较方便
- 首先是判断两个树相等的递归函数,可以参考【leetcode】100.相同的树的递归写法
- 判断一个树是另一个树的子树的递归函数
- 三种情况满足其一就返回true
- 两棵树相等
- s的左子树等于t
- s的右子树等于t
- 三种情况满足其一就返回true
代码
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @param {TreeNode} subRoot
* @return {boolean}
*/
var isSubtree = function(root, subRoot) {
// 判断两棵树是否相等的递归函数
function isSame(s , t){
if(!s && !t) return true
if(!s || !t) return false
if(s.val !== t.val) return false
return isSame(s.left , t.left) && isSame(s.right , t.right)
}
// 判断子树的递归函数
function isSub(s , t){
if(!s && !t) return true
if(!s || !t) return false
return isSame(s , t) || isSub(s.left , t) || isSub(s.right , t)
}
return isSub(root , subRoot)
};
关注我的专栏,每天更新三道leetcode题解,一起变强!