二十天刷题计划--另一棵树的子树

115 阅读2分钟

「这是我参与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)
};