暑假集训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; }
方法三:两棵树~未完待续...
相关文章推荐
- 暑假集训 8.19 图结构练习——判断给定图是否存在合法拓扑序列 sdut2140
- 暑假集训 8.13 数据结构实验之排序二:交换排序 (冒泡 与 快排.....)
- 暑假集训 8.16 数据结构实验之排序三:bucket sort (简单的桶排序)
- SDUTOJ 2482 二叉排序树
- 暑假集训 8.6 sdutoj2484 算术表达式的转换(模拟栈;前中后缀转换)
- SDUTOJ(2482)二叉排序树
- 2015暑假ACM集训结训赛(第一场)(SDUTOJ)
- 二叉排序树 SDUTOJ 2482
- 暑假集训日记--8.10--二分+单调队列+练习赛
- 暑假集训7.28 各种模拟栈 sdutoj2134 括号匹配
- 判断一颗二叉树是否为二叉排序树
- (建二叉排序树、是否为同一二叉排序树)2482二叉排序树
- 【算法渣渣的逆袭之路】summer training warmming up,暑假的集训要开始啦,先来几道题热热身
- CSU-ACM2016暑假集训比赛8
- 2014暑假集训个人赛1 数字整除
- 暑假集训第二周——贪心 G - Game Prediction游戏预测
- Selenium IDE 扩展函数,判断表格某列是否被排序.(Check whether a column has been ordered.)
- 1367判断一个数组是否为二叉排序树的后序遍历结果
- 暑假集训——个人训练赛04——E题
- 暑假集训 8.11-2 树结构练习——判断给定森林中有多少棵树 sdut2198 并查集