我试图理解树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);
}
有人能解释一下它们有什么不同,或者给我指出一些好的资源来理解这些概念吗?
1条答案
按热度按时间5ssjco0h1#
假设值在
t
两次出现在s
,但其中只有一个位于匹配的子树的根t
. 如果你的第一个代码先打错了,它就会返回false
永远不要继续寻找另一个,而第二个会继续寻找。