题目描述
给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和结点值的子树。s 的一个子树包括 s 的一个结点和这个结点的所有子孙。s 也可以看做它自身的一棵子树。
样例
给定的树 s:
3
/ \
4 5
/ \
1 2
给定的树 t:
4
/ \
1 2
返回 true,因为 t 与 s 的一个子树拥有相同的结构和节点值。
给定的树 s:
3
/ \
4 5
/ \
1 2
/
0
给定的树 t:
4
/ \
1 2
返回 false。
算法
(暴力遍历) $O(nm)$
- 思路很简单,对于 s 的每一个结点,都尝试与 t 进行匹配,此操作递归进行即可。
- 匹配时,仍然需要递归匹配当前 s 中的子树和 t 的每一个结点。
时间复杂度
- s 的每个结点都需要 $O(m)$ 的时间匹配,故总时间复杂度为 $O(nm)$。
C++ 代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool dfs(TreeNode *s, TreeNode *t) {
if (!s)
return false;
return isSame(s, t) || dfs(s -> left, t) || dfs(s -> right, t);
}
bool isSame(TreeNode *s, TreeNode *t) {
if (!s && !t)
return true;
if (!s && t || s && !t || s -> val != t -> val)
return false;
return isSame(s -> left, t -> left) && isSame(s -> right, t -> right);
}
bool isSubtree(TreeNode* s, TreeNode* t) {
return dfs(s, t);
}
};
大佬,有个问题想问下,我注释掉
dfs()
函数中的if(!s) return false
后,报的执行出错RE,但是它说我下面这个样例没过,我手动调试了下,这个样例不会碰到s为0的情况。这是为什么吖?
if (!s) return false
的意思是如果s
是空指针,则直接返回false
,一般用于边界条件的判断。这里不是说结点的值为0
,返回false
。