使用dfs确定给定的树是否是子树 看起来不错!差不多了!

问题描述

我正在尝试确定一棵树(t)是否是另一棵树的子树。

这是指向leetcode的链接,该链接彻底解释了问题:https://leetcode.com/problems/subtree-of-another-tree/

我的方法我有一个函数在s上执行dfs,并在另一个函数中将每个节点与t的根进行比较,以确定t是否为s的子树

我的解决方案不适用于s = [1,1]和t = [1]的情况,尽管我认为它应该起作用。您能否看一下我的代码并解释错误所在。

/**
 * 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 s,TreeNode t) {
        /* dfs on s,at each node running a compare tree function for s at that node and
        root of t*/
        
        if(s == null || t == null) {
            return false;
        }
        
        return dfs(s,t);
    }
    
    public static boolean dfs(TreeNode s,TreeNode t) {
        if(s == null) {
            return false;
        }
        
        if(s.val == t.val) {
            return isSameTree(s,t);
        }
        
        
        return dfs(s.left,t) || dfs(s.right,t);
    }
    
    public static boolean isSameTree(TreeNode s,TreeNode t) {
        if(s == null || t == null) {
            return s == t;
        }
        
        if(s.val != t.val) {
            return false;
        }
        
        return isSameTree(s.left,t.left) && isSameTree(s.right,t.right);
    }
}

解决方法

如果java.awt.Window是否是该节点的子树,则需要检查s的所有节点。如果在t上执行dfs时在第一个节点处停止,并且其值与s的根相同,但子树不同,则树t的另一个节点可能具有其值和子树两者都与s相同。

换句话说,您需要重复第一步(在t上执行dfs并将s的每个节点与s的根进行比较),直到您检查了t(在s上完成dfs)或发现st的子树。

s

不要仅仅因为s和t的根值相同而从s的根返回。如果t不是该节点的子树,请继续执行dfs来查找另一个值和子树都与t相同的节点(在这种情况下,s的根的左子节点)。

为更清楚起见,下面是突出显示已更正部分的代码:

            s                        t

           (1)                      (1)
          /
       (1) 
,

看起来不错!差不多了!

这将通过:

public class Solution {
    public static final boolean isSubtree(
        final TreeNode s,final TreeNode t
    ) {
        if (s == null) {
            return false;
        }

        if (checkNextLevel(s,t)) {
            return true;
        }

        return isSubtree(s.left,t) ||
               isSubtree(s.right,t);
    }

    private static final boolean checkNextLevel(
        final TreeNode s,final TreeNode t
    ) {
        if (s == null && t == null) {
            return true;
        }

        if (
            (s == null || t == null) ||
            (s.val != t.val)
        ) {
            return false;
        }


        return checkNextLevel(s.left,t.left) &&
               checkNextLevel(s.right,t.right);
    }
}