比较二叉树是否相同

1. 问题描述:

        比较两个二叉树是否相同,不仅要结点数据相同,二叉树的形状也要相同。

2. 代码思路:

        第一:判断两棵树是否都为空,如果都为空,则直接可以判断为二叉树相同。

        第二:判断是否存在二叉树一个为空一个不为空,则直接可以判断为二叉树不相同。

        第三:判断二叉树没次遍历的结点是否相同,不相同可以判断为二叉树不相同。

        第四:左右子树递归。

        最后:判断左右子树递归的时候,是否存在不相同的地方,如果不相同断整个二叉树都不相同,否则整个二叉树相同。

3. 代码实现

3.1 二叉树的数据结构

#define MAXSIZE 100

typedef struct BiTNode
{
	int data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

3.2 中序创建二叉树

void CreatBiTree(BiTree *BT)		//中序建立树
{
	char ch;
	scanf("%c",&ch);
	if(ch=='#')
		*BT=NULL;
	else{
		*BT = (BiTree)malloc(sizeof(BiTNode));
		CreatBiTree(&(*BT)->lchild);
		(*BT)->data=ch;
		CreatBiTree(&(*BT)->rchild);
	}
}

3.3  先序遍历二叉树

void PreOrderTravel(BiTree BT)
{
	if(BT==NULL)
		return;
	PreOrderTravel(BT->lchild);
	PreOrderTravel(BT->rchild);
	printf("%c ",BT->data);
}

记住口诀:中左右。中代表结点,左代表左子树,右代表右子树。

3.4  比较两个二叉树是否相同

int cmpTree(BiTree A,BiTree B)
{
	int left,right;
	if(A==NULL&&B==NULL)			//A,B都为空
		return 1;
	else if(A==NULL||B==NULL)		//A,B其中一个为空
		return 0;
	if(A->data!=B->data)			//数据不相等
		return 0;
	left=cmpTree(A->lchild,B->lchild);
	right=cmpTree(A->rchild,B->rchild);

	return left&&right;

}

4. 全部代码

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
#include<conio.h>

#define MAXSIZE 100

typedef struct BiTNode
{
	int data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

void CreatBiTree(BiTree *BT)		//中序建立树
{
	char ch;
	scanf("%c",&ch);
	if(ch=='#')
		*BT=NULL;
	else{
		*BT = (BiTree)malloc(sizeof(BiTNode));
		CreatBiTree(&(*BT)->lchild);
		(*BT)->data=ch;
		CreatBiTree(&(*BT)->rchild);
	}
}

int cmpTree(BiTree A,BiTree B)
{
	int left,right;
	if(A==NULL&&B==NULL)			//A,B都为空
		return 1;
	else if(A==NULL||B==NULL)		//A,B其中一个为空
		return 0;
	if(A->data!=B->data)			//数据不相等
		return 0;
	left=cmpTree(A->lchild,B->lchild);
	right=cmpTree(A->rchild,B->rchild);

	return left&&right;

}

void PreOrderTravel(BiTree BT)
{
	if(BT==NULL)
		return;
	PreOrderTravel(BT->lchild);
	PreOrderTravel(BT->rchild);
	printf("%c ",BT->data);
}

int main()
{
	 BiTree A,B;

    A = (BiTree)malloc(sizeof(BiTNode));
	B = (BiTree)malloc(sizeof(BiTNode));
    printf("请给二叉树A按照中序方式依次输入结点的值(空结点为#):\n");
    CreatBiTree(&A);
	printf("\n");
	PreOrderTravel( A);
	printf("请给二叉树B按照中序方式依次输入结点的值(空结点为#):\n");
	getchar();
    CreatBiTree(&B);
	printf("\n");
	PreOrderTravel( B);
	if(cmpTree(A,B))
		printf("A,B二叉树相等!");
	else
		printf("A,B二叉树不相等!");
	getchar();
	getchar();
	return 0;
}

要是想学二叉树其他内容,可以看看小编的其他博文。

二叉树的全部用法(包括递归、非递归遍历,求高度、叶子结点数、交换左右子树)_业余小程序猿的博客-CSDN博客

  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值