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;
}
要是想学二叉树其他内容,可以看看小编的其他博文。