二叉树包含问题

有两颗二叉树A,B 判断A是否包含B

思路: 第一步,在A中找到B的根节点,记录下此时A中的节点,把此节点作为下一步的根节点

         第二步,分别从根往下搜索,判断是否会遇到不等的值

typedef struct treenode
{
int data;
struct treenode *left;
struct treenode *right;
}treenode;
int value[100],tnums;

//建树
void creat_tree(treenode **head,int i)
{
if(i>tnums-1)
*head=NULL;
else
{
treenode *tmp=new treenode();
*head=tmp;
tmp->data=value[i];
creat_tree(&tmp->left,2*i+1);
creat_tree(&tmp->right,2*(i+1));
}
}

//搜寻节点
bool search_tree(treenode **head,treenode **node,int data)
{
if(*head==NULL) return false;
if((*head)->data==data)
{
*node=(*head);
return true;
}
else
{
bool flag=(search_tree(&(*head)->left,node,data)||search_tree(&(*head)->right,node,data));
return flag;
}
}

//判断是否包含的第二不
bool cmp_tree(treenode **t1,treenode **t2)
{

if(*t2==NULL) return true;
if(*t1==NULL) return false;
if((*t1)->data==(*t2)->data)
{
return (cmp_tree(&(*t1)->left,&(*t2)->left)&&cmp_tree(&(*t1)->right,&(*t2)->right));
}
else return false;
}

//前序遍历
void print_tree(treenode **head)
{
if(*head==NULL) return;
printf("data:%d\n",(*head)->data);
print_tree(&(*head)->left);
print_tree(&(*head)->right);
}
int main()
{

while(cin>>tnums)
{
treenode *head,*node=NULL;
for(int i=0;i<tnums;i++)
cin>>value[i];
creat_tree(&head,0);
print_tree(&head);
treenode *head2;
cin>>tnums;
for(int i=0;i<tnums;i++)
cin>>value[i];
creat_tree(&head2,0);
print_tree(&head2);

if(search_tree(&head,&node,head2->data))
{
if(cmp_tree(&node,&head2)) cout<<"exi"<<endl;
else cout<<"ffff"<<endl;
}
else cout<<"no data"<<endl;
}
return 0;
}

posted @ 2012-08-25 10:56  wuzhibin  阅读(223)  评论(0编辑  收藏  举报