二叉树——判断两棵二叉树是否相等(先序和中序遍历序列建立二叉树)

来源:互联网 发布:淘宝收货延迟多长时间 编辑:程序博客网 时间:2024/06/06 01:47

需求:

利用先序遍历序列和中序遍历序列来建立两棵二叉树,并判断是否相等

需要先将创建二叉树

创建的方法是将该二叉树的先序的序列和中序的序列分别存储到Pre数组和Mid数组中,它们的存储顺序如下:

这里写图片描述


判断两棵树是否相等

采用递归的方法,用先序,中序,后序遍历的方法对两棵树每个数据判断是否相等

  • 两棵树都为空,返回1
  • 两棵树不相等,返回0
  • 两棵树相等,返回1

代码解析及代码如下:

#include <stdio.h>#include <string.h>typedef char TElemType;////存储先序和中序序列字符数组char Pre[100],Mid[100];typedef struct BiTNode{    TElemType data;    struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;//创建二叉树//Pre_star.....代表数组下标BiTree BiTree_Creat(BiTree T,int Pre_start,int Pre_end,int Mid_start,int Mid_end){    int i;    int LtreeLen,RtreeLen;    T=(BiTree)malloc(sizeof(BiTNode));    if(!T)    {        printf("malloc_error!");    }    //////先序很容易找到根结点,中序的话需要遍历    T->data=Pre[Pre_start];//取先序序列中第一个字符作为根结点的数据域值    //////查找中序序列中的根结点    for(i=Mid_start;Mid[i]!=T->data;)    {        ++i;////根结点在序列i位置    }    ////计算左右子树结点个数    LtreeLen=i-Mid_start;    RtreeLen=Mid_end-i;    if(LtreeLen)////不断深入左子树    {        T->lchild=BiTree_Creat(T,Pre_start+1,Pre_start+LtreeLen,Mid_start,Mid_start+LtreeLen-1);    }    else    {        T->lchild=NULL;    }    if(RtreeLen)////不断深入右子树    {        T->rchild=BiTree_Creat(T,Pre_end-RtreeLen+1,Pre_end,Mid_end-RtreeLen+1,Mid_end);    }    else    {        T->rchild=NULL;    }    return T;}////先序判断两树是否相等int Pre_Cmp(BiTree T1,BiTree T2){    //如果两树都为空,返回1    if(!T1&&!T2)    {        return 1;    }    if(T1&&T1)    {        if(T1->data==T2->data)        {            if(Pre_Cmp(T1->lchild,T2->lchild))//递归左子树每个数据是否相等            {                if(Pre_Cmp(T1->rchild,T2->rchild))//递归右子树每个数据是否相等                {                    return 1;//两树完全相等,返回1                }            }        }    }    return 0;//两树不相等,返回0}////中序判断两树是否相等int In_Cmp(BiTree T1,BiTree T2){    if(!T1&&!T2)    {        return 1;    }    if(T1&&T2)    {        if(In_Cmp(T1->lchild,T2->lchild))        {            if(T1->data==T2->data)            {                if(In_Cmp(T1->rchild,T2->rchild))                {                    return 1;                }            }        }    }    return 0;}////后序判断两树是否相等int Last_Cmp(BiTree T1,BiTree T2){    if(!T1&&!T2)    {        return 1;    }    if(T1&&T2)    {        if(Last_Cmp(T1->lchild,T2->lchild))        {            if(T1->rchild,T2->rchild)            {                if(T1->data==T2->data)                {                    return 1;                }            }        }    }    return 0;}int main(){    BiTree T1,T2;    int Is_Bitree;    int ch;    strcpy(Pre,"abcde");//先序顺序    strcpy(Mid,"bdcae");//中序顺序    T1=BiTree_Creat(T1,0,4,0,4);    T2=BiTree_Creat(T2,0,4,0,4);    while(1)    {        printf("***///T1T2相等或都为空则输出1,否则反之///***\n\n");        printf("1_Pre_Cmp\n");        printf("2_In_Cmp\n");        printf("3_Last_Cmp\n");        printf("4_exit\n");        scanf("%d",&ch);        switch(ch)        {            case 1:Is_Bitree=Pre_Cmp(T1,T2);printf("%d",Is_Bitree);break;            case 2:Is_Bitree=In_Cmp(T1,T2);printf("%d",Is_Bitree);break;            case 3:Is_Bitree=Last_Cmp(T1,T2);printf("%d",Is_Bitree);break;            case 4:return;            default:printf("input error!");        }        printf("\n");    }    return 0;}
阅读全文
0 0
原创粉丝点击