判断二叉树B是不是二叉树A的子树

题目:输入两棵二叉树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;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值