二叉排序树

来源:互联网 发布:cda数据分析师怎么样 编辑:程序博客网 时间:2024/06/05 19:41

二叉排序树

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

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

输入

开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉排序树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉排序树。(数据保证不会有空树)

输出

 

示例输入

21234567899876543214321567890

示例输出

NONO
#include<bits/stdc++.h>using namespace std;struct Tree{    Tree *left;    Tree *right;    char data;};void creatTree(Tree *&root,int number){    if(root==NULL)    {        root=new Tree();        root->data=number;        root->left=root->right=NULL;    }    else    {        if(number>root->data)            creatTree(root->right,number);        else            creatTree(root->left,number);    }}int judge(Tree *root1,Tree *root2){    if(root1&&root2)    {        if(root1->data==root2->data)return judge(root1->left,root2->left)&&judge(root1->right,root2->right);        else return 0;    }    else if(root1==NULL&&root2==NULL)return 1;    else return 0;}int main(){    int n;    char a[10];    char b[10];    int len1;    int len2;    while(~scanf("%d",&n))    {        if(n==0)break;        else        {            Tree *root1=NULL;            scanf("%s",a);            len1=strlen(a);            for(int i=0;i<len1;i++)                creatTree(root1,a[i]-'0');            while(n--)            {                Tree *root2=NULL;                scanf("%s",b);                len2=strlen(b);                for(int i=0;i<len2;i++)                    creatTree(root2,b[i]-'0');                if(judge(root1,root2))printf("YES\n");                else printf("NO\n");            }        }    }}

0 0
原创粉丝点击