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。
💡 思路
DFS暴力匹配。DFS 枚举 s 中的每一个节点,判断这个点的子树是否和 t 相等。如何判断一个节点的子树是否和 t 相等呢,我们又需要做一次 DFS 来检查,即让两个指针一开始先指向该节点和 t 的根,然后「同步移动」两根指针来「同步遍历」这两棵树,判断对应位置是否相等。 具体到下方代码,如果s为null,则返回false;否则,进行3个判断,之间是或的关系,即任何一个满足即可。这三个判断分别是:判断s和t是否相等;判断s的左孩子和t是否相等,判断s的右孩子和t是否相等。这三者任何一个满足,就返回true。 isSameTree()方法是判断2个二叉树是否相等的。先判断当前的节点值是否想等。若二者都为null,则返回true;若任意一个为null而另一个不是null,或二者的值不同,则返回false。否则,继续check二者的左子树和右子树。左右子树的结果进行与运算,即它们都相等时,两棵树才相等。
📋 代码
class Solution {
public boolean isSubtree(TreeNode s, TreeNode t) {
if (s == null) return false;
return isSubtree(s.left, t) || isSubtree(s.right, t) || isSameTree(s, t);
}
boolean isSameTree(TreeNode s, TreeNode t) {
if (s == null && t == null) return true;
if (s == null || t == null || s.val != t.val) {
return false;
}
return isSameTree(s.left, t.left) && isSameTree(s.right, t.right);
}
}
复杂度:
你认为这篇文章怎么样?
- 0很棒
- 0不错
- 0一般
- 0???