判断一棵树是否是另一棵树的子树,操作方法主要分成两部分,
第一部分是确定子树的根节点在待检测树中的位置,检测方法很是简单,使用先序遍历整棵树,如果遍历中节点的值等于子树的根节点的值即可
第二部分,是在第一部分的基础上,已经有了两个根节点,所以我们可以使用递归的方法,进行判断,直到带判断的两个节点中有一个是NULL即可
struct BinTree
{
int val;
BinTree* left;
BinTree* right;
BinTree():val(0),left(NULL),right(NULL){};
};
BinTree* CreateBinTree()
{
BinTree* head=NULL,*cur=NULL;
int a=0;
while(cin>>a&&a!=-1)
{
if(NULL==head)
{
head=cur=new BinTree();
head->val=a;
continue;
}
while(NULL!=cur)
{
if(cur->val<a)
{
//应该位于cur的右子树上
if(NULL==cur->right)
{
cur->right=new BinTree();
cur->right->val=a;
cur=head;
break;
}
else
{
cur=cur->right;
}
}
else
{
//应该位于左子树上
if(NULL==cur->left)
{
cur->left=new BinTree();
cur->left->val=a;
cur=head;
break;
}
else
{
cur=cur->left;
}
}
}
}
return head;
}
bool hasTree(BinTree* const root_1,BinTree* root_2)
{
bool result=false;
if(NULL==root_2)
return true;
if(NULL==root_1)
{
return false;
}
if(root_1->val==root_2->val)
{
result=(hasTree(root_1->left,root_2->left))&&(hasTree(root_1->right,root_2->right));
}
return result;
}
bool PosRoot(BinTree* const proot,BinTree* const subTree)
{
if(NULL==proot)
{
return false;
}
if(NULL==subTree)
{
return true;
}
bool result=false;
if(proot->val==subTree->val)
{
result=hasTree(proot,subTree);
}
if(!result)
{
if(NULL!=proot->left)
result=hasTree(proot->left,subTree);
}
if(!result)
{
if(NULL!=proot->right)
result=hasTree(proot->right,subTree);
}
return result;
}
int main()
{
cout<<"请输入第一棵树,以-1结尾\n";
BinTree* head=CreateBinTree();
cout<<"请输入第二棵树,以-1结尾\n";
BinTree* head1=CreateBinTree();
if(PosRoot(head,head1))
{
cout<<"子树关系成立\n";
return 0;
}
cout<<"子树关系不成立\n";
return 0;
}
这样就完成了子树的判断,主要注意的其实就一点,我们要首先理清思路!!!!