另一个树的子树
剑指 Offer 26. 树的子结构
以上题来源:力扣
这两道题的区别:
首先我们要区分这两者的区别,那么就好理解了
树的子结构:
B是A的子结构, 即 A中有出现和B相同的结构和节点值。(约定空树不是任意一个树的子结构)
例如:
给定的树 A:
3
/ \
4 5
/
1 2
给定的树 B:
4
/
1
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。
另一个树的子树:
示例 1:
给定的树 s:
3
/ \
4 5
/
1 2
给定的树 t:
4
/
1 2
返回 true,因为 t 与 s 的一个子树拥有相同的结构和节点值。
这里我们就了解了,子结构可以是一部分和全部,但是子树就必须全部相同哦
树的子结构代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSubStructure(TreeNode A, TreeNode B) {
if(A == null || B == null) {
return false;
}
return helper(A,B) || isSubStructure(A.left,B) || isSubStructure(A.right,B);
}
private boolean helper(TreeNode A, TreeNode B){
if(B == null) return true; //说明越过叶子节点了,也就是B已经遍历结束了
if(A == null) return false; //B还没结束,A越过叶子节点了,很显然A不包含B结构;
return A.val == B.val
&& helper(A.left,B.left)
&& helper(A.right,B.right);
}
}
另一个树的子树代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSubtree(TreeNode s, TreeNode t) {
if (s == null) return false;
if (t == null) return true;
if (isSame(s, t)) return true;
if (isSubtree(s.left, t)) return true;
if (isSubtree(s.right, t)) return true;
return false;
}
private boolean isSame(TreeNode p, TreeNode q){
if (p == null && q == null) {
return true;
}else if (p == null || q == null) {
return false;
}else if (p.val != q.val) {
return false;
} else {
return isSame(p.left,q.left) && isSame(p.right,q.right);
}
}
}
总结一下:两者既有相同的地方,也有不同的地方,看题时要更加仔细。