团体程序设计天梯赛-练习集 L2-004. 这是二叉搜索树吗?GU
2016-07-05 12:00
190 查看
团体程序设计天梯赛-练习集
L2-004. 这是二叉搜索树吗?
https://www.patest.cn/contests/gplt/L2-004
根据二叉搜索树的定义进行递归,先找到左枝与右枝的分界,再递归搜索左枝与右枝。在递归的同时就可以记录后序排序结果。
注意:
如果没有右枝要单独判断。
递归最后要返回true。
后面注释掉是的是两个递归的方法。
L2-004. 这是二叉搜索树吗?
https://www.patest.cn/contests/gplt/L2-004
根据二叉搜索树的定义进行递归,先找到左枝与右枝的分界,再递归搜索左枝与右枝。在递归的同时就可以记录后序排序结果。
注意:
如果没有右枝要单独判断。
递归最后要返回true。
后面注释掉是的是两个递归的方法。
#include<iostream> #include<cstdio> using namespace std; int A[1005], cnt, B[1005]; bool thistree(int s, int d,int tab) { if (s > d - 1) { return true; } if (s == d - 1) { B[cnt++] = A[s]; return true; } int i; bool flag = true; for (i = s + 1; i < d; i++) { if (tab ? A[s] <= A[i] : A[s] > A[i]) { flag = false; if (!thistree(s + 1, i, tab)) { return false; } break; } } if (flag) { if (!thistree(s + 1, d, tab)) { return false; } } else { for (int j = i; j < d; j++) { if (tab ? A[s] > A[j]:A[s] <= A[j]) { return false; } } if (!thistree(i, d, tab)) { return false; } } B[cnt++] = A[s]; return true; } int main() { int N; while (scanf("%d", &N) != EOF) { if (N == 0) { printf("YES\n"); continue; } for (int i = 0; i < N; i++) { scanf("%d", &A[i]); } if (thistree(0, N, 1)) { cnt = 0; printf("YES\n"); for (int i = 0; i < N - 1; i++) { printf("%d ", B[i]); } /*pr(0, N - 1, 1);*/ printf("%d\n", B[N - 1]); } else if (thistree(0, N, 0)) { cnt = 0; printf("YES\n"); for (int i = 0; i < N-1; i++) { printf("%d ", B[i]); } /*pr(0, N - 1, 0);*/ printf("%d\n", B[N - 1]); } else { printf("NO\n"); } } return 0; } //void pr(int l, int r, int tab) { // if (l > r) return; //debug 越界判断 // if (l == r) { // printf(++cnt == 1 ? "%d" : " %d", A[l]); // return; // } // int root = A[l], i; // bool fl, fr; // for (i = l + 1; i <= r + 1; i++) { // fl = fr = true; // for (int j = i; j <= r; j++) { // if (tab ? A[j] < root : A[j] >= root) { // fr = false; // break; // } // } // for (int j = i - 1; j > l; j--) { // if (tab ? A[j] >= root : A[j] < root) { // fl = false; // break; // } // } // if (fr && fl) { // break; // } // } // pr(l + 1, i - 1, tab); // pr(i, r, tab); // printf(++cnt == 1 ? "%d" : " %d", root); //}
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- C#模拟http 发送post或get请求的简单实例
- Lua教程(七):数据结构详解
- Transformation 能将 Windows XP/Server 2003 操作系统,完美地模拟成 Windows Vista 的软件
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 用javascript和css模拟select的脚本
- 数据结构之Treap详解
- PHP模拟asp.net的StringBuilder类实现方法
- C#使用ImitateLogin模拟登录百度
- javascript用层模拟可移动的小窗口
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- JS模拟简易滚动条效果代码(附demo源码)
- 自编jQuery插件实现模拟alert和confirm
- JS模拟按钮点击功能的方法