求:
检查子树。你有两棵非常大的二叉树:T1,有几万个节点;T2,有几万个节点。设计一个算法,判断 T2 是否为 T1 的子树。
如果 T1 有这么一个节点 n,其子树与 T2 一模一样,则 T2 为 T1 的子树,也就是说,从节点 n 处把树砍断,得到的树与 T2 完全相同。
示例1:
输入:t1 = [1, 2, 3], t2 = [2]
输出:true
示例2:
输入:t1 = [1, null, 2, 4], t2 = [3, 2]
输出:false
提示:
树的节点数目范围为[0, 20000]。
解:
思路:判断t1和其子树是否有某颗树与t2相等即可,递归实现。只要有相等的树,返回真,否则返回假。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool
isSameTree(
struct
TreeNode* p,
struct
TreeNode* q){
if
(p==NULL && q==NULL)
return
true
;
if
(p==NULL || q==NULL)
return
false
;
return
(p->val==q->val) &&isSameTree(p->left,q->left) &&isSameTree(p->right,q->right);
}
bool
checkSubTree(
struct
TreeNode* t1,
struct
TreeNode* t2){
if
(t1==NULL)
return
t2==NULL;
return
isSameTree(t1,t2)||checkSubTree(t1->left,t2)||checkSubTree(t1->right,t2);
}
来源:oschina
链接:https://my.oschina.net/u/4469818/blog/4290418