在检查二叉树是否是另一棵树的子树时理解递归函数

y3bcpkx1  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(328)

我试图理解树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 {
    private boolean result = false;
    public boolean isSubtree(TreeNode s, TreeNode t) {
        return isTinS(s, t);
    }

    public boolean isTinS(TreeNode s, TreeNode t) {
        if (t==null) return true;
        if (s==null) return false;

        if (s.val == t.val) {
           return isSame(s,t);
        }
        return isTinS(s.left, t) || isTinS(s.right, t);
    }

    public boolean isSame(TreeNode s, TreeNode t) {
        if (s==null && t==null) return true;
        if (s==null || t==null) return false;
        return s.val==t.val && isSame(s.left, t.left) && isSame(s.right, t.right);
    }
}

如果我在istins函数中改变if条件,它就会工作。我很难弄清楚这两种代码之间的区别。

public boolean isTinS(TreeNode s, TreeNode t) {
        if (t==null) return true;
        if (s==null) return false;

        if (isSame(s,t)) {
            return true;
        }
        return isTinS(s.left, t) || isTinS(s.right, t);
    }

有人能解释一下它们有什么不同,或者给我指出一些好的资源来理解这些概念吗?

5ssjco0h

5ssjco0h1#

假设值在 t 两次出现在 s ,但其中只有一个位于匹配的子树的根 t . 如果你的第一个代码先打错了,它就会返回 false 永远不要继续寻找另一个,而第二个会继续寻找。

相关问题