描述:
有两个不同大小的二叉树: T1
有上百万的节点; T2
有好几百的节点。请设计一种算法,判定 T2
是否为 T1
的子树。
注意事项 :若 T1 中存在从节点 n 开始的子树与 T2 相同,我们称 T2 是 T1 的子树。也就是说,如果在 T1 节点 n 处将树砍断,砍断的部分将与 T2 完全相同。
样例:
下面的例子中 T2 是 T1 的子树:
1 3
/ \ /
T1 = 2 3 T2 = 4
/
4
下面的例子中 T2 不是 T1 的子树:
1 3 / \ \ T1 = 2 3 T2 = 4 / 4
标签:递归 二叉树
思路:
利用递归,从根节点往下递归,判断子树是否存在其的左子树或右子树内。
代码:
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
bool issubtree;
bool isSubtree(TreeNode *T1,TreeNode *T2){
issubtree=false;
preorderTraversal(T1,T2);
if(T2==NULL){
issubtree=true;
}
return issubtree;
}
void preorderTraversal(TreeNode *root,TreeNode *node){
if(root!=NULL&&issubtree==false){
issubtree=Judge(root,node);
preorderTraversal(root->left,node);
preorderTraversal(root->right,node);
}
}
bool Judge(TreeNode *node1,TreeNode *node2){
bool leftissubtree,rightissubtree;
if(node1!=NULL){
if(node2!=NULL&&node1->val==node2->val){
leftissubtree=Judge(node1->left,node2->left);
rightissubtree=Judge(node1->right,node2->right);
if(leftissubtree&&rightissubtree){
return true;
}
}
}
else {
if(node2==NULL){
return true;
}
}
return false;
}
};
public:
bool issubtree;
bool isSubtree(TreeNode *T1,TreeNode *T2){
issubtree=false;
preorderTraversal(T1,T2);
if(T2==NULL){
issubtree=true;
}
return issubtree;
}
void preorderTraversal(TreeNode *root,TreeNode *node){
if(root!=NULL&&issubtree==false){
issubtree=Judge(root,node);
preorderTraversal(root->left,node);
preorderTraversal(root->right,node);
}
}
bool Judge(TreeNode *node1,TreeNode *node2){
bool leftissubtree,rightissubtree;
if(node1!=NULL){
if(node2!=NULL&&node1->val==node2->val){
leftissubtree=Judge(node1->left,node2->left);
rightissubtree=Judge(node1->right,node2->right);
if(leftissubtree&&rightissubtree){
return true;
}
}
}
else {
if(node2==NULL){
return true;
}
}
return false;
}
};