给定两个非空二叉树 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。
分析:
首先判断头节点是不是相同,不同的话就判断左或者右节点是否相同,如果都相同那么返回true,否则递归判断s->left和s->right与t是否匹配,成功返回true,失败返回false。
注意:
在leetcode里面,C语言写的函数应该写在调用之前,否则编译不通过。
在进行递归判断的时候,参数 s 应该一次改变为左右节点,而 t 应该还是 t ,不能习惯性的写出 t 的左右节点。
bool isSame(struct TreeNode *s,struct TreeNode *t){
if(!s&&!t)
return true;
if(!s||!t)
return false;
if(s->val == t->val){
bool left = isSame(s->left,t->left);
bool right = isSame(s->right,t->right);
if(left && right)
return true;
}
return false;
}
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool isSubtree(struct TreeNode* s, struct TreeNode* t) {
if(!s && !t)
return true;
if(!s || !t)
return false;
if(s->val == t->val && isSame(s,t)){
return true;
}else{
bool left = isSubtree(s->left,t);
if(left)
return true;
bool right = isSubtree(s->right,t);
if(right)
return true;
return false;
// if(left || right)
// return true;
// return false;
}
return false;
}
函数的递归部分,用了两个判断语句,而没有将两句递归写在一起是为了减少递归次数,因为如果左子树递归返回true,那么就没有必要再递归右子树了。如果不理解可以将isSubtree()函数的else部分改写成如下代码:
bool left = isSubtree(s->left,t);
bool right = isSubtree(s->right,t);
if(left || right)
return true;
return false;