[leetCode]572. 另一个树的子树
题目
给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。
示例 1:
给定的树 s:
3
/ \
4 5
/ \
1 2
给定的树 t:
4
/ \
1 2
返回 true,因为 t 与 s 的一个子树拥有相同的结构和节点值。
示例 2:
给定的树 s:
3
/ \
4 5
/ \
1 2
/
0
给定的树 t:
4
/ \
1 2
返回 false。
递归
思路先通过后序遍历遍历二叉树,将当前节点值与t树的头节点值进行比较如果相同则进行递归比较s的子树与t是否相同,如果相同返回true,如果不同则继续遍历二叉树
class Solution {
public boolean isSubtree(TreeNode s, TreeNode t) {
if (s == null && t == null) {
return true;
}
if (s == null && t != null) {
return false;
}
boolean isSub = isSubtree(s.left, t) || isSubtree(s.right, t);
if (s.val == t.val) {
if (compare(s, t)) {
return true;
}
}
return isSub;
}
private boolean compare(TreeNode p, TreeNode q) {
if (p == null && q != null)
return false;
else if (p != null && q == null)
return false;
else if (p == null && q == null)
return true;
else if (p.val != q.val) return false;
return compare(p.left, q.left) && compare(p.right, q.right);
}
}
迭代
相同思路,改用迭代
class Solution {
public boolean isSubtree(TreeNode s, TreeNode t) {
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(s);
while (!queue.isEmpty()) {
TreeNode cur = queue.poll();
if (cur.val == t.val) {
if (compare(cur, t)) {
return true;
}
}
if (cur.left != null)
queue.offer(cur.left);
if (cur.right != null)
queue.offer(cur.right);
}
return false;
}
private boolean compare(TreeNode p, TreeNode q) {
Queue<TreeNode> queue1 = new LinkedList<>();
queue1.offer(p);
queue1.offer(q);
while (!queue1.isEmpty()) {
TreeNode l = queue1.poll();
TreeNode r = queue1.poll();
if (l == null && r != null)
return false;
else if (r == null && l != null)
return false;
else if (r == null && l == null)
continue;
else if (r.val != l.val)
return false;
queue1.offer(l.left);
queue1.offer(r.left);
queue1.offer(l.right);
queue1.offer(r.right);
}
return true;
}
}