失败学专家诶♬ 2023-07-26 23:21 采纳率: 83.9%
浏览 5
已结题

关于#递归#的问题,如何解决?

关于力扣题目:判断一棵树是否为另一颗子树
原思路:先找到一个和subroot节点相同值的节点,然后递归找,但是后面发现这样做会有个别节点值重复的数测试不会通过,但是现在又不知道怎么改了,然后卡在这了

img

img


```java
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
       TreeNode target= preoreder(root,subRoot.val);
       return isSub(target,subRoot);
    }
    //先找一个返回与目标值相同的节点:
    public static TreeNode preoreder(TreeNode root, int val) {
        if (root == null || root.val == val)
            return root;
        TreeNode foundNode = preoreder(root.left, val);
        if (foundNode == null)
            foundNode = preoreder(root.right, val);
        return foundNode;
    }
    //从节点值与子树相等的节点开始进行递归判断是否相等:
    public static boolean isSub(TreeNode root, TreeNode subRoot){
        if(root==null&&subRoot==null)
            return true;
        if(root==null||subRoot==null|| root.val!=subRoot.val)
            return false;
        return isSub(root.left,subRoot.left)&&isSub(root.right,subRoot.right);
    }


```

  • 写回答

3条回答 默认 最新

  • 藏柏 2023-07-27 09:32
    关注
    
    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        List<TreeNode> targetNodes = findNodesWithSameValue(root, subRoot.val);
        for (TreeNode target : targetNodes) {
            if (isSub(target, subRoot)) {
                return true;
            }
        }
        return false;
    }
    
    // 找到所有和目标值相同的节点
    public List<TreeNode> findNodesWithSameValue(TreeNode root, int val) {
        List<TreeNode> result = new ArrayList<>();
        if (root == null) {
            return result;
        }
    
        if (root.val == val) {
            result.add(root);
        }
    
        result.addAll(findNodesWithSameValue(root.left, val));
        result.addAll(findNodesWithSameValue(root.right, val));
        return result;
    }
    
    // 从节点值与子树相等的节点开始进行递归判断是否相等
    public boolean isSub(TreeNode root, TreeNode subRoot) {
        if (root == null && subRoot == null) {
            return true;
        }
        if (root == null || subRoot == null || root.val != subRoot.val) {
            return false;
        }
        return isSub(root.left, subRoot.left) && isSub(root.right, subRoot.right);
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 8月4日
  • 已采纳回答 7月27日
  • 创建了问题 7月26日

悬赏问题

  • ¥15 微信小程序 用oss下载 aliyun-oss-sdk-6.18.0.min client报错
  • ¥15 ArcGIS批量裁剪
  • ¥15 labview程序设计
  • ¥15 为什么在配置Linux系统的时候执行脚本总是出现E: Failed to fetch http:L/cn.archive.ubuntu.com
  • ¥15 Cloudreve保存用户组存储空间大小时报错
  • ¥15 伪标签为什么不能作为弱监督语义分割的结果?
  • ¥15 编一个判断一个区间范围内的数字的个位数的立方和是否等于其本身的程序在输入第1组数据后卡住了(语言-c语言)
  • ¥15 Mac版Fiddler Everywhere4.0.1提示强制更新
  • ¥15 android 集成sentry上报时报错。
  • ¥15 抖音看过的视频,缓存在哪个文件