题目:输入两棵二叉树A和B,判断B是不是A的子结构。
#include <stdio.h>
#include <malloc.h>
typedef struct node
{
int value;
struct node *left;
struct node *right;
}node,*pnode;
void create_tree1(pnode *root1)
{
pnode node[7];
int i;
for(i=0;i<7;i++)
{
node[i] = (pnode)malloc(sizeof(node));
if(!node[i])
{
printf("分配空间失败!\n");
return;
}
node[i]->left = NULL;
node[i]->right = NULL;
}
node[0]->value = 8;
node[1]->value = 8;
node[2]->value = 7;
node[3]->value = 9;
node[4]->value = 2;
node[5]->value = 4;
node[6]->value = 7;
node[0]->left = node[1];
node[0]->right = node[2];
node[1]->left = node[3];
node[1]->right = node[4];
node[4]->left = node[5];
node[4]->right = node[6];
*root1 = node[0];
}
void create_tree2(pnode *root2)
{
pnode node[3];
int i;
for(i=0;i<3;i++)
{
node[i] = (pnode)malloc(sizeof(node));
if(!node[i])
{
printf("分配空间失败!\n");
return;
}
node[i]->left = NULL;
node[i]->right = NULL;
}
node[0]->value = 8;
node[1]->value = 9;
node[2]->value = 2;
node[0]->left = node[1];
node[0]->right = node[2];
*root2 = node[0];
}
void create_tree3(pnode *root3)
{
pnode node[4];
int i;
for(i=0;i<4;i++)
{
node[i] = (pnode)malloc(sizeof(node));
if(!node[i])
{
printf("分配空间失败!\n");
return;
}
node[i]->left = NULL;
node[i]->right = NULL;
}
node[0]->value = 8;
node[1]->value = 9;
node[2]->value = 2;
node[3]->value = 0;
node[0]->left = node[1];
node[0]->right = node[2];
node[2]->left = node[3];
*root3 = node[0];
}
void print_tree(pnode root)//前序遍历
{
if(root==NULL)
return;
printf("%d\t",root->value);
if(root->left != NULL)
print_tree(root->left);
if(root->right != NULL)
print_tree(root->right);
}
bool issubtree_core(pnode root1, pnode root2)
{
if(root2 == NULL)//要在root1==NULL前面判断,因为会出现root2==null&&root1==null的情况
return true;
if(root1 == NULL)
return false;
if(root1->value != root2->value)
return false;
return issubtree_core(root1->left,root2->left) && issubtree_core(root1->right,root2->right);//判断左子树和右子树是不是也相同
}
bool issubtree(pnode root1, pnode root2)
{
bool flag = false;
if(root1!=NULL && root2!=NULL)
{
if(root1->value == root2->value)//先判断根节点相同否
flag = issubtree_core(root1,root2);
if(!flag)
flag = issubtree_core(root1->left,root2);//再试左子树结点相同否
if(!flag)
flag = issubtree_core(root1->right,root2);//再试右子树结点相同否
}
return flag;
}
int main()
{
pnode root1,root2,root3;
bool flag;
create_tree1(&root1);
printf("tree1结点为:\n");
print_tree(root1);
printf("\n");
create_tree2(&root2);
printf("tree2结点为:\n");
print_tree(root2);
printf("\n");
create_tree3(&root3);
printf("tree3结点为:\n");
print_tree(root3);
printf("\n");
flag = issubtree(root1,root2);
if(flag)
printf("tree2是tree1的子树!\n");
else
printf("tree2不是tree1的子树!\n");
flag = issubtree(root1,root3);
if(flag)
printf("tree3是tree1的子树!\n");
else
printf("tree3不是tree1的子树!\n");
return 0;
}