力扣:572. 另一棵树的子树

目录

一.题目

二.解题思路

三.代码

四.题后语


一.题目

        1.题目详情

        给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。

        二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。

        要求:如果存在,返回 true ;否则,返回 false 。

示例 1:

输入:root = [3,4,5,1,2], subRoot = [4,1,2]
输出:true

力扣:572. 另一棵树的子树 - 力扣(Leetcode)https://leetcode.cn/problems/subtree-of-another-tree/submissions/386562968/

二.解题思路

        1.使用深度优先搜索先找root中的subroot的根结点

        2.然后判断基于该结点的两个树是否相等

三.代码

class Solution {
    public boolean isSubtree(TreeNode s, TreeNode t) {
        return dfs(s, t);
    }

    public boolean dfs(TreeNode s, TreeNode t) {//找到root与subroot根节点相同的结点
        if (s == null) {
            return false;
        }
        return check(s, t) || dfs(s.left, t) || dfs(s.right, t);
    }

    public boolean check(TreeNode s, TreeNode t) {//判断两个树是否相等
        if (s == null && t == null) {
            return true;
        }
        if (s == null || t == null || s.val != t.val) {
            return false;
        }
        return check(s.left, t.left) && check(s.right, t.right);
    }
}

四.题后语(/(ㄒoㄒ)/~~)

        我一开始的想法是,将两个树用先序遍历的方式转换为一个列表,然后通过判断是否第一个列表里面是否存在第二个列表的方式来判断是否subroot是否是root的子树,代码附再后面。这个方法我运行时是没有通过第二组测试数据。不知道是什么原因,大佬可以帮我看看。然后就是看的解析,解析的方法一是直接通过dfs直接暴力对比求得结果,方法二感觉跟我的方法有点像有有些不一样,没有理解。

 

/**
 * 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 {
    List rootList = new ArrayList();
    List subrootList = new ArrayList();
    public void preorder(TreeNode root){
        if(root==null){
            rootList.add(root);
           return;
        }else{
            rootList.add(root);
            preorder(root.right); 
            preorder(root.left);
        }
    }
    public void subpreorder(TreeNode root){
        if(root==null){
            subrootList.add(root);
           return;
        }else{
            subrootList.add(root.val);
            preorder(root.right); 
            preorder(root.left);
        }
    }
    public boolean rootsub(List rootList,List subrootList){
           boolean flag=true;
            for(int j=0;j<rootList.size();j++){
                int i=0;
                if(rootList.get(j)==subrootList.get(i)){
                  for(int n=1;n<subrootList.size();n++){
                      if(rootList.get(j+n)!=subrootList.get(i+n)){
                          flag=false;
                      }
                  }
                }
            }
            return flag;
    }
    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        subpreorder(subRoot);
        preorder(root);
        return rootsub(rootList,subrootList);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值