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

本文介绍了一种通过先序和中序遍历序列构建二叉树的方法,并提供了使用递归算法判断两棵二叉树是否相等的实现。通过三个不同的遍历顺序进行比较,确保了树结构的一致性。
需求:

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

需要先将创建二叉树

创建的方法是将该二叉树的先序的序列和中序的序列分别存储到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;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值