暑假集训8.10 sdutoj2482 二叉排序树 (是否为同一颗排序树)

来源:互联网 发布:php获取表单数据 编辑:程序博客网 时间:2024/05/17 23:17

二叉排序树

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

题目描述

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

输入

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

输出

见下

示例输入

21234567899876543214321567890

示例输出

NONO

方法一:遍历数组元素,数组元素与第一个元素比较 分两个数组 大于第一个元素放在pre数组 小于的话放在last数组

然后后面数组也如上操作 

遍历结束后 比较两个字符数组的pre和last数组 看是否相同 一旦不相同 no;

注 数组第一个元素不同  一定 NO;

样例

3

3142  {1,2}3{4}

3124(yes){1,2}3{4}

3214(no)  {2,1}3{4}

4123(no)  {1,2.3}4{}

字符数组模拟实现 不贴代码了...太low......


方法二:叮咚~

毕竟不是比赛,所以还是规规矩矩的敲排序二叉树吧

注:此为建立一棵树的方法  So多了一个flag 


///ACcode

#include <bits/stdc++.h>using namespace std;typedef struct tree{    int data;    int flag; ///用来判断来没来过    tree *lc,*rc;} tree ,*Tree;void Insert(Tree &T,int key) ///递归插入排序二叉树{    if (!T)    {        T=new tree;        T->data=key;        T->lc=NULL;        T->rc=NULL;        T->flag=0; ///初始0 设为没查找到过    }    else if (key > T->data)    {        Insert(T->rc,key);    }    else if (key < T->data)    {        Insert(T->lc,key);    }}bool TF=1; ///判断 Yes(TF=1) or No(0) 的变量void Find(Tree &T,int key)  ///查找函数{    if (TF)     {        if (T->flag==0)  ///表示没查找到过        {            if (key==T->data)  ///如果两值相等 标记flag=1;            {                T->flag=1;            }            else  ///如果不等 则 "NO"..因为按照插入的顺序Find 某个元素之前是不会有没被找到过的(就是这个元素之前没有flag=0的)            {                TF=0;                return ;            }        }        if (T->flag==1)  ///如果之前查找到过 则继续Find.....        {            if (key > T->data)            {                Find(T->rc,key);            }            else if (key < T->data)            {                Find(T->lc,key);            }        }    }}void Reset(Tree &T)  ///重置一下flag=0;{    if (T)    {        T->flag=0;        Reset(T->lc);        Reset(T->rc);    }}int main(){    int n,m,i,num,key;    Tree T;    while (cin>>n&&n)    {        cin>>m;        T=NULL;        for (i=1; i<=n; i++)        {            cin>>num;            Insert(T,num);        }        for (int j=1; j<=m; j++)        {            TF=1;  ///重置一下 TF            for (i=1; i<=n; i++)            {                cin>>key;                Find(T,key);            }            Reset(T); ///重置一下 flag            TF==1?cout<<"Yes"<<endl:cout<<"No"<<endl;        }    }    return 0;}


方法三:两棵树~未完待续...

1 0