持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情
572. 另一棵树的子树
给你两棵二叉树 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
解题思路
// 递归遍历
判断一个二叉树中是否含有另一个二叉树
首先我们需要一个比较的函数compare,用来比较两个树的节点是否相等,如果相等返回true,否则返回false,树的左边和左边进行比较,右边和右边进行比较
如果通过比较,我们发现这个compare函数直接返回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) {
// 比较二叉树
const compare = (left, right) => {
if (left === null && right === null) {
return true;
} else if (
left !== null && right === null ||
left === null && right !== null ||
left.val !== right.val
) {
return false;
}
let leftSide = compare(left.left, right.left);
let rightSide = compare(left.right, right.right);
let simeSide = leftSide && rightSide;
return simeSide;
}
// 判断root不能为null
if (root === null) return false;
// 如果两个树直接项目,则直接返回true,就不用递归便利了
if (compare(root,subRoot)) return true;
// 复杂的情况需要进行递归遍历,看两个树是否有相同的地方
return isSubtree(root.left,subRoot) || isSubtree(root.right, subRoot);
};
如果你对这道题目还有疑问的话,可以在评论区进行留言;