二叉排序树--SDUT

Description

二叉排序树的定义是:或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。 今天我们要判断两序列是否为同一二叉排序树

Input

开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。

接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉排序树。

接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉排序树。(数据保证不会有空树)

Output

Sample

Input 

2

123456789

987654321

432156789

0

Output 

NO

NO

Hint

#include <iostream>
#include <stdio.h>
#include <cstring>

using namespace std;

const int maxn=12;
struct node
{
    char data;
    node* l;
    node* r;
};
char p[maxn];
node* Insert(node *root,char x)
{
    if(root==NULL)
    {
        root=new node;
        root->data=x;
        root->l=NULL;
        root->r=NULL;
    }
    else
    {
        if(x<root->data)
            root->l=Insert(root->l,x);
        else
            root->r=Insert(root->r,x);
    }
    return root;
}
int cmp(node* r1,node* r2)
{
    if(r1&&r2){
        if(r1->data!=r2->data)
            return 0;
        else if(cmp(r1->l,r2->l)&&cmp(r1->r,r2->r))
            return 1;
        else
            return 0;
    }
    else if(!r1&&!r2)
        return 1;
    else
        return 0;

}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF&&n!=0)
    {
        node* root1=NULL;

        scanf("%s",p);
        int len=strlen(p);
        for(int i=0; i<len; i++)
            root1=Insert(root1,p[i]);
        while(n--)
        {
            node* root2=NULL;
            scanf("%s",p);
            len=strlen(p);
            for(int i=0; i<len; i++)
                root2=Insert(root2,p[i]);
            if(cmp(root1,root2)==1)
                printf("YES\n");
            else
                printf("NO\n");
        }
    }

    return 0;
}
发布了78 篇原创文章 · 获赞 3 · 访问量 1663

猜你喜欢

转载自blog.csdn.net/weixin_43307431/article/details/104424888