判断两个序列构成的两个二叉排序树是否相同

本文介绍了一种通过输入序列构建二叉搜索树的方法,并实现了先序与中序遍历来验证两棵树是否相同。利用C/C++语言完成树的构建及遍历,通过字符串比较函数确定树的一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:对输入的数字序列构建二叉排序树,分别进行先序遍历和中序遍历(唯一构成一个二叉树)。比较两个序列的前序遍历和中序遍历是否相同,相同则是同一颗二叉搜索树。



#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>///记得加上.h

using namespace std;


typedef struct BiNode
{
    char data;
    struct BiNode *lchild,*rchild;

}BiNode,*BiTree;

void pre_order (BiTree T,char pre_array[],int &index)///先序遍历内部函数index是数组下标,因为递归时需要改变,
{                                                    ///index必须使用引用型。
    if(T!=NULL)
    {
        pre_array[index++]=T->data;
        pre_order(T->lchild,pre_array,index);
        pre_order(T->rchild,pre_array,index);

    }

}

void Pre_order(BiTree T,char pre_array[])///先序遍历
{
    int index=0;
    pre_order(T,pre_array,index);
    pre_array[index]='\0';//遍历结束后,在字符串数组最后加入结束符,便于使用字符串函数。

}

void in_order(BiTree T,char in_array[],int &index)
{
    if(T!=NULL)
    {
        in_order(T->lchild,in_array,index);
        in_array[index++]=T->data;
        in_order(T->rchild,in_array,index);
    }
}

void In_order(BiTree T,char in_array[])
{
    int index=0;
    in_order(T,in_array,index);
    in_array[index]='\0';
}

int insertBST (BiTree &T,char key)
{
    if(T==NULL)
    {
        T=(BiNode*)malloc(sizeof(BiNode));
        T->lchild=NULL;
        T->rchild=NULL;
        T->data=key;
        return 1;
    }
    else
    {
        if(key==T->data)
        {
            return 0;
        }
        else if(T->data>key)
        {
            return insertBST(T->lchild,key);
        }
        else if(T->data<key)
        {
            return insertBST(T->rchild,key);
        }
    }
}



void *CreatBiSTree (BiTree &T,char key[],int n)
{
    int i;
    T=NULL;
    for(i=0;i<n;i++)
    {
        insertBST(T,key[i]);
    }
}



char init[11];///初始序列
char cmp[11];///需比较序列

char pre_array1[11],pre_array2[11];
char in_array1[11],in_array2[11];

int main()
{
    BiNode *T1;///初始排序树
    BiNode *T2;///比较序列排序树

    int n;
    while(scanf("%d",&n)!=EOF && n!=0)
    {
        scanf("%s",init);
        CreatBiSTree(T1,init,strlen(init));
        Pre_order(T1,pre_array1);
        In_order(T1,in_array1);
        while(n--)///结束条件:比较完n组序列
        {
            scanf("%s",cmp);
            CreatBiSTree(T2,cmp,strlen(cmp));
            Pre_order(T2,pre_array2);
            In_order(T2,in_array2);

            int flag;
            flag=strcmp(pre_array1,pre_array2) || strcmp(in_array1,in_array2);
            if(flag==0)
            {
                printf("YES!\n");
            }
            else
            {
                printf("NO!\n");
            }
        }
    }

    return 0;
}


 方法:将输入的序列存入两个字符型数组中,以此构建二叉排序树。再分别将其前序与中序遍历序列存入pre_array[]和in_array[]中,利用strcmp函数比较是否相同。


strcmp

C/C++函数,比较两个字符串
设这两个字符串为str1,str2,
若str1==str2,则返回零;
若str1<str2,则返回负数;
若str1>str2,则返回正数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值