您的位置:首页 > 理论基础 > 数据结构算法

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

2016-08-10 21:31 330 查看

二叉排序树


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

题目描述

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

输入

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

输出

见下

示例输入

2
123456789
987654321
432156789
0


示例输出

NO
NO


方法一:遍历数组元素,数组元素与第一个元素比较 分两个数组 大于第一个元素放在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;
}


方法三:两棵树~未完待续...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息