剑指offer第二十三题【二叉搜索树的后序遍历序列】c++实现
2015-10-18 22:15
453 查看
二叉搜索树的后序遍历序列
参与人数:1784时间限制:1秒空间限制:32768K
通过比例:20.62%
最佳记录:0 ms|8552K(来自 牛客456244号)
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
后序遍历最后一个是根节点,往前找第一个比根节点小的是左子树的根节点,根节点左边就是右子树的根节点。
递归思路就显而易见了。
参与人数:1784时间限制:1秒空间限制:32768K
通过比例:20.62%
最佳记录:0 ms|8552K(来自 牛客456244号)
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。后序遍历最后一个是根节点,往前找第一个比根节点小的是左子树的根节点,根节点左边就是右子树的根节点。
递归思路就显而易见了。
bool VerifySquenceOfBST(vector<int> sequence) { if(sequence.empty()){ return false; } if(sequence.size()==1){ } vector<int> lsequence; vector<int> rsequence; int length=sequence.size(); int root=length-1; int left=-1; int right=-1; for(int i=root-1;i>=0;i--){ if(i==root-1){ if(sequence[i]>sequence[root]){ right=i; } } if(sequence[i]<sequence[root]){ left=i; break; } } bool flag=true;; if(left!=-1){ for(int i=0;i<=left;i++){ if(sequence[i]>sequence[root]){ return false; } lsequence.push_back(sequence[i]); } flag=VerifySquenceOfBST(lsequence); } if(right!=-1){ for(int i=left+1;i<=right;i++){ if(sequence[i]<sequence[root]){ return false; } rsequence.push_back(sequence[i]); } flag=VerifySquenceOfBST(rsequence); } return flag; }
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua和C语言的交互详解
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总