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

需求:

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

需要先将创建二叉树

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

二叉树——判断两棵二叉树是否相等(先序和中序遍历序列建立二叉树)_第1张图片


判断两棵树是否相等

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

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

代码解析及代码如下:

#include 
#include 
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;
}

你可能感兴趣的:(●,数据结构)