美文网首页算法
LeetCode题解:一棵树是否是另一棵树的子树

LeetCode题解:一棵树是否是另一棵树的子树

作者: 搬码人 | 来源:发表于2022-06-04 09:37 被阅读0次

    题目描述

    给你两棵二叉树root和subRoot 。检验root中是否包含和subRoot具有相同结构和节点值的子树。如果存在,返回true;否则,返回false。
    二叉树tree的一棵子树包括tree的某个节点和这个节点的所有后代节点。tree也可以看作它自身的一棵子树。

    示例

    • 示例1
      输入:root = [3,4,5,1,2], subRoot = [4,1,2]
      输出:true
      示例1
    • 示例2
      输入:root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2]
      输出:false
      示例2

    思路方法

    将是否是子树问题转化为是否相等的问题
    判断两树是否相等有三个条件:

    • 当前两个树的根节点值相等;
    • 并且,s的左子树和t的左子树相等;
    • 并且,s的右子树和t的右子树相等。
      而判断t是否是s的子树有三个或条件
    • 当前两棵树相等;
    • 或t是s的左子树;
    • 或t是s的右子树。
    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode() {}
     *     TreeNode(int val) { this.val = val; }
     *     TreeNode(int val, TreeNode left, TreeNode right) {
     *         this.val = val;
     *         this.left = left;
     *         this.right = right;
     *     }
     * }
     */
    class Solution {
        public boolean isSubtree(TreeNode root, TreeNode subRoot) {
            return dfs(root,subRoot);
        }
        public boolean dfs(TreeNode root,TreeNode subRoot){
            if(root==null){
                return false;
            }
            return check(root,subRoot)||dfs(root.left,subRoot)||dfs(root.right,subRoot);
        }
        public boolean check(TreeNode root,TreeNode subRoot){
            if(root==null&&subRoot==null){
                return true;
            }
            if(root==null||subRoot==null||root.val!=subRoot.val){
                return false;
            }
            return check(root.left,subRoot.left)&&check(root.right,subRoot.right);
        }
    }
    

    相关文章

      网友评论

        本文标题:LeetCode题解:一棵树是否是另一棵树的子树

        本文链接:https://www.haomeiwen.com/subject/qhekmrtx.html