「这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战」。
1.题目
另一棵树的子树
给你两棵二叉树 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树的所有节点,将s树的每个节点都当做一颗树的根节点
var isSubtree = function(s, t) {
if(!s&&t){
return false;
}
let linkNode = function(node,target){
}
return linkNode(s,t)||isSubtree(s.left,t)||isSubtree(s.right,t)
};
内层函数遍历s的子树的每个节点与t的每个节点是否相等
一个节点相同则返回(true&&下一个节点的比较结果) 不同则直接返回false 递归出口: .s子树节点为空,t不为空,返回false s子树节点不为空,t为空,返回false s子树节点与t子树节点同时为空,返回true s子树节点值等于t子树节点值,返回true s子树节点值不等于t子树节点值,返回false
let linkNode = function(node,target){
if(!node&&target)return false;
if(node&&!target)return false;
if(!node&&!target) return true
if(node.val===target.val){
return linkNode(node.left,target.left)&&linkNode(node.right,target.right)
}else{
return false
}
}
// s子树节点为空,t不为空,返回false s子树节点不为空,t为空,返回false s子树节点与t子树节点同时为空,返回true s子树节点值等于t子树节点值,返回true s子树节点值不等于t子树节点值,返回false
代码
var isSubtree = function(s, t) {
//1.遍历s的所有节点,看那个节点和t的根节点相等
//2.相等则继续遍历下去,匹配余下节点,知道t树遍历完
if(!s&&t){
return false;
}
let linkNode = function(node,target){
if(!node&&target)return false;
if(node&&!target)return false;
if(!node&&!target) return true
if(node.val===target.val){
return linkNode(node.left,target.left)&&linkNode(node.right,target.right)
}else{
return false
}
}
return linkNode(s,t)||isSubtree(s.left,t)||isSubtree(s.right,t)
};