子树
问题描述:
有两个不同大小的二进制树: T1 有上百万的节点; T2 有好几百的节点。请设计一种算法,判定 T2 是否为 T1的子树。
样例
下面的例子中 T2 是 T1 的子树:
1 3
/ \ /
T1 = 2 3 T2 = 4
/
4
下面的例子中 T2 不是 T1 的子树:
1 3
/ \ \
T1 = 2 3 T2 = 4
/
4
解题思路:
利用前序遍历,首先从根结点开始与给定的T2的第一个结点比较,若相等,则继续向下比较;否则将根结点的左子树与T2的第一个结点比较,以此类推,直至找到和T2相同的子树或者遍历完T1仍未找到与T2相同的子树。
代码实现:
class Solution {
public:
/**
* @param T1, T2: The roots of binary tree.
* @return: True if T2 is a subtree of T1, or false.
*/
bool isSubtree(TreeNode *T1, TreeNode *T2) {
// write your code here
if(T1==NULL&&T2==NULL) return 1;
else {
if(T1==NULL&&T2!=NULL) return 0;
}
if(isSubtree2(T1,T2)) return 1;
if(isSubtree(T1->left,T2)){
return 1;
}
if(isSubtree(T1->right,T2)){
return 1;
}
return 0;
}
bool isSubtree2(TreeNode *T1,TreeNode*T2){
if(T1==NULL&&T2==NULL) return 1;
if(T1!=NULL&&T2==NULL||T1==NULL&&T2!=NULL) return 0;
if(T1->val!=T2->val) { return 0;}
else{ if(!isSubtree2(T1->left,T2->left))
return 0;
if(!isSubtree2(T1->right,T2->right))
return 0;
}
return 1;
}
};
public:
/**
* @param T1, T2: The roots of binary tree.
* @return: True if T2 is a subtree of T1, or false.
*/
bool isSubtree(TreeNode *T1, TreeNode *T2) {
// write your code here
if(T1==NULL&&T2==NULL) return 1;
else {
if(T1==NULL&&T2!=NULL) return 0;
}
if(isSubtree2(T1,T2)) return 1;
if(isSubtree(T1->left,T2)){
return 1;
}
if(isSubtree(T1->right,T2)){
return 1;
}
return 0;
}
bool isSubtree2(TreeNode *T1,TreeNode*T2){
if(T1==NULL&&T2==NULL) return 1;
if(T1!=NULL&&T2==NULL||T1==NULL&&T2!=NULL) return 0;
if(T1->val!=T2->val) { return 0;}
else{ if(!isSubtree2(T1->left,T2->left))
return 0;
if(!isSubtree2(T1->right,T2->right))
return 0;
}
return 1;
}
};
A题感悟:
我觉得这道题思路很容易想到,但是细节不好处理,要考虑到方方面面,需要另设函数,若某个结点与T2的第一个结点相同时,则需要使用另设的结点判断此结点之后的值是否完全与T2相同。