L2-004. 这是二叉搜索树吗?
来源:互联网 发布:nba2k14季后赛数据 编辑:程序博客网 时间:2024/06/11 18:17
本题要求:
一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,其左子树中所有结点的键值小于该结点的键值;其右子树中所有结点的键值大于等于该结点的键值;其左右子树都是二叉搜索树。所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。
输入格式:
输入的第一行给出正整数N(<=1000)。随后一行给出N个整数键值,其间以空格分隔。
输出格式:
如果输入序列是对一棵二叉搜索树或其镜像进行前序遍历的结果,则首先在一行中输出“YES”,然后在下一行输出该树后序遍历的结果。数字间有1个空格,一行的首尾不得有多余空格。若答案是否,则输出“NO”。
输入样例:
78 6 5 7 10 8 11
输出样例:
YES5 7 6 8 11 10 8
解题思路 :
直接按给定的数字创建二叉搜索树。接着先序遍历,看看是否与给定的数组相同。如果不相同,则进行镜像判断(就是先从右再左),进行先序遍历,看看是否与给定数组相同。注意输出的时候,如果镜像相同,就输出镜像。
代码 :
#include<iostream>#include<cstring>#include<sstream>#include<cmath>#include<cstdio>#include<algorithm>using namespace std;int a[1001];int n;class Node { public: int data; Node* left; Node* right; Node(int d) { data = d; left = NULL; right = NULL; } Node() { this->data = 0; left = NULL; right = NULL; }};class Tree { public: Node* head; Tree() { head = NULL; } bool isOk; void insert(int k) { head = insert(head, k); } void display() { isYes = true; i = 0; display(head); if (isYes) { cout << "YES" << endl; i = 0; display2(head); } else { isYes = true; i = 0; display3(head); if (isYes) { cout << "YES" << endl; i = 0; display4(head); } else { cout << "NO" << endl; } } } bool isYes; private: int i; void display(Node* node) { if (node == NULL || !isYes) { return; } if (node->data != a[i]) { isYes = false; } i++; display(node->left); display(node->right); } void display2(Node* node) { if (node == NULL) { return; } display2(node->left); display2(node->right); if(i != 0) { cout << " "; } cout << node->data; i++; } void display3(Node* node) { if (node == NULL || !isYes) { return; } if (node->data != a[i]) { isYes = false; } i++; display3(node->right); display3(node->left); } void display4(Node* node) { if (node == NULL) { return; } display4(node->right); display4(node->left); if(i != 0) { cout << " "; } cout << node->data; i++; } Node* insert(Node* node, int k) { if (node == NULL) { node = new Node(k); return node; } if (k < node->data) { node->left = insert(node->left, k); } else { node->right = insert(node->right, k); } return node; }};int main() { cin >> n; Tree* tree = new Tree(); for(int i = 0; i < n; i++) { cin >> a[i]; tree->insert(a[i]); } tree->display(); return 0;}
0 0
- L2-004. 这是二叉搜索树吗?
- PAT L2-004. 这是二叉搜索树吗?
- PAT L2-004. 这是二叉搜索树吗?
- L2-004. 这是二叉搜索树吗?
- L2-004. 这是二叉搜索树吗?
- L2-004. 这是二叉搜索树吗?
- L2-004. 这是二叉搜索树吗?
- L2-004. 这是二叉搜索树吗?
- L2-004. 这是二叉搜索树吗?
- L2-004. 这是二叉搜索树吗?
- L2-004. 这是二叉搜索树吗?
- PAT L2-004. 这是二叉搜索树吗?
- L2-004. 这是二叉搜索树吗
- PAT--L2-004. 这是二叉搜索树吗?
- L2-004. 这是二叉搜索树吗?
- L2-004. 这是二叉搜索树吗?
- L2-004. 这是二叉搜索树吗?
- L2-004. 这是二叉搜索树吗? (搜索二叉树的性质)
- Spring学习心得(21)-- spring与jdbc结合的方式
- 学习spring cloud第一课(微服务架构概述)
- oc——类——方法成员
- c++关键字总结
- L2-007
- L2-004. 这是二叉搜索树吗?
- $.ajax()方法详解
- Androidstudio升级2.3填坑
- SWIG c# 引用 c++dll
- 无限流量与5G即将来临,我们距淘汰Wi-Fi还有多少时间?
- hibernate搭建
- 加载动态链接库的相关接口dlopen,dlsym和dlclose等
- tomcat启动报错
- jdk版本无法切换问题