博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
L2-004. 这是二叉搜索树吗
阅读量:4114 次
发布时间:2019-05-25

本文共 1249 字,大约阅读时间需要 4 分钟。

一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,

  • 其左子树中所有结点的键值小于该结点的键值;
  • 其右子树中所有结点的键值大于等于该结点的键值;
  • 其左右子树都是二叉搜索树。

所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。

给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。

输入格式:

输入的第一行给出正整数N(<=1000)。随后一行给出N个整数键值,其间以空格分隔。

输出格式:

如果输入序列是对一棵二叉搜索树或其镜像进行前序遍历的结果,则首先在一行中输出“YES”,然后在下一行输出该树后序遍历的结果。数字间有1个空格,一行的首尾不得有多余空格。若答案是否,则输出“NO”。

输入样例1:
78 6 5 7 10 8 11
输出样例1:
YES5 7 6 8 11 10 8
输入样例2:
78 10 11 8 6 7 5
输出样例2:
YES11 8 10 7 5 6 8
输入样例3:
78 6 8 5 10 9 11
输出样例3:

NO

思路:由二叉树的性质,左子树的值都小于根节点的值,右子树的值度大于等于根节点的值,所以我们可以递归遍历这棵树进行判断,题目中说给的序列可能是原树前序遍历的结果,也有可能是镜像以后树的前序遍历序列,我们可以先判断是不是原树的前序遍历结果,如果不是在进行镜像树的判断。

在判断时候我们可以通过查找当前这棵树的左右子树,由于是前序遍历的结果,所以左子树结束的位置就是右子树开始的位置,所以这时候我们判断一下左子树结束位置和右子树开始位置之差是不是1,然后在递归进行判断。

#include 
using namespace std;const int maxn=1050;int a[maxn];bool isMarr;vector
v;int n;void gettree(int root,int tail){ if(root>tail) return; int i=root+1; int j=tail; if(!isMarr) { while(i<=tail&&a[root]>a[i]) i++; while(j>root&&a[root]<=a[j]) j--; } else { while(i<=tail&&a[root]<=a[i]) i++; while(j>root&&a[root]>a[j]) j--; }// cout<
<<" "<
<
>n; for(int i=0; i
>a[i]; isMarr=false; gettree(0,n-1);// cout<
<

转载地址:http://wbgsi.baihongyu.com/

你可能感兴趣的文章
沙雕程序员在无聊的时候,都搞出了哪些好玩的小玩意...
查看>>
Mysql复制表以及复制数据库
查看>>
Kafka
查看>>
9.1 为我们的角色划分权限
查看>>
维吉尼亚之加解密及破解
查看>>
TCP/IP协议三次握手与四次握手流程解析
查看>>
PHP 扩展开发 : 编写一个hello world !
查看>>
inet_ntoa、 inet_aton、inet_addr
查看>>
用模板写单链表
查看>>
链表各类操作详解
查看>>
C++实现 简单 单链表
查看>>
Linux的SOCKET编程 简单演示
查看>>
Linux并发服务器编程之多线程并发服务器
查看>>
C语言内存检测
查看>>
Linux epoll模型
查看>>
Linux系统编程——线程池
查看>>
Linux C++线程池实例
查看>>
shared_ptr的一些尴尬
查看>>
C++总结8——shared_ptr和weak_ptr智能指针
查看>>
c++写时拷贝1
查看>>