何海涛算法面试题感悟之六:二元查…
例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:
8
/ \
6 10
/ \ / \
5 7 9 11
因此返回true。
如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false
树的后续遍历有这样一条性质:每一条子树的遍历顺序中,根总是拍在后面,根的左子树中所有节点出现的顺序总是出现在该子树根的左边,并且左子树所有的节点都比根来的小,而根的右子树中所有节点出现的顺序总是出现在该子树根的右边,并且左子树所有的节点都比根来的大。
由此,我们就可以想到递归算法,将数组中的最后一个元素拿出来,作为根,然后从左往右扫描,直到扫描到第一个比根大的元素A,则停止扫描,这样就将除根以外的数组分成两部分,即对应数的左子树和右子树,然后从A开始扫描,我们知道,如果这是一颗二元查找树的后续遍历的话,从A到根之前的所有整数都应该大于根节点,如果发现有小于根节点的,那肯定就不是二元查找树了,直接返回false,否则,递归判断左子树和右子树,然后必须左子树和右子树同时是二叉查找树才能返回true
参考代码
using namespace std;
bool verifySquenceOfBST(int squence[], int length)
{
if(squence == NULL || length <= 0)
return false;
//将数组中的最后一个元素作为根
int root = squence[length - 1];
//扫描到第一个比根节点大的整数
int i = 0;
for(; i < length - 1; ++ i)
{
if(squence[i] > root)
break;
}
// 如果右子树中有小于根节点的值,直接返回false
int j = i;
for(; j < length - 1; ++ j)
{
if(squence[j] < root)
return false;
}
//验证左子树是否为二叉查找树
//首先必须有左子树,如果没有的话,就可以认为左子树是二叉查找树
bool left = true;
if(i > 0)
left = verifySquenceOfBST(squence, i);
//如果左子树不是二叉查找树,直接返回false
if(left==false) return false;
//否则继续验证右子树
//首先必须有右子树,如果没有的话,就可以认为右子树是二叉查找树
bool right = true;
if(i < length - 1)
right = verifySquenceOfBST(squence + i, length - i - 1);
return right;
}
本篇文章对应何海涛博客
http://zhedahht.blog.163.com/blog/static/25411174200725319627/
何海涛算法面试题感悟之六:二元查…相关推荐
- 何海涛算法面试题感悟之四:二元树…
题目:输入一个整数和一棵二元树.从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径.打印出和与输入整数相等的所有路径. 例如输入整数22和如下二元树 10 ...
- 何海涛算法面试题感悟之一:将二叉…
题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 比如将二元查找树 ...
- 何海涛算法面试题感悟之五:查找最…
题目:输入n个整数,输出其中最小的k个. 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4. 一个简单的方法就是排序,先将这n个数按从大到小排序,最快需要O(nlog ...
- 何海涛算法面试题感悟之二:设计包…
题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素.要求函数min.push以及pop的时间复杂度都是O(1) 如果没有min,该栈可以很轻松地构造出来,现在添加了一个min功能,首 ...
- 何海涛算法面试题感悟之九:寻找链…
题目:输入一个单向链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针.链表结点定义如下: struct ListNode { int m_nKey; ...
- 何海涛算法面试题感悟之三:子数组…
题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n). 例如输入的数组为1, -2, 3, ...
- 微软的100道算法面试题(终结版)
前言 数据结构与算法的重要性已不言而喻,最近,我整理出十大经典排序算法.五大常用算法总结,今天特意整理出微软面试的100题,若有不足之处,欢迎指正!由于篇幅过长,前30道题目写在上一篇,大家可以进我的 ...
- 程序员应该掌握的经典算法面试题
不忘初心,方得始终.何谓"初心"?初心便是在深度学习.人工智能呼风唤雨的时代,对数据和结论之间那条朴素之路的永恒探寻,是集前人之大智,真诚质朴求法向道的心中夙愿. 没有最好的分类器 ...
- 数据结构经典算法面试题
转自:http://hi.baidu.com/geogre_jsj/blog/item/e4b98fd2aab5aa3611df9b92.html 由于这些题,实在太火了.所以,应广大网友建议要求,在 ...
最新文章
- mac设置linux环境,如何在mac或者linux配置oh-my-zsh
- vue中如何画饼状图
- 成功解决ImportError: cannot import name ‘joblib‘
- 1337:【例3-2】单词查找树
- jqGrid + JSON + WebService 完整示例
- 创建线程的第二种方法(实现Runnable接口)
- server2019 sqlcmd命令安装_Ubuntu20.04LTS安装MS sql-server2019的方法
- linux shell切割脚本,自动分割日志bash shell脚本
- 读书随笔:The Book of Why——CHAPTER 1:The Ladder of Causation
- Dijstra算法-------为了纪念,等以后看的时候方便
- 关于移动支付的一点知识
- 计算机四级(网络工程师)内容,计算机四级《网络工程师》考试内容
- 北斗文档下载工具-百度文库文档每天免费2次机会下载
- 中国行政村边界数据、乡镇街道边界
- antdesign 新增页面_ant design pro 新增页面
- html5圆形图片自动旋转,纯CSS3圆形图片鼠标滑过旋转翻盖动画特效
- 菜狗收到了图后很开心,玩起了pdf 提交格式为flag{xxx},解密字符需小写
- 2020年云计算发展趋势怎么样?
- katana材质的制作-1
- 真实诈骗案例积累(一)