二叉搜索树的后序遍历序列:递归中不要过早return f(左)&&f(右)
2017-03-15 15:42
246 查看
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。1.我是想把判断大小(递归终止)留到start>end,这题不用深度递归到叶节点,可以第一遍遍历就判断根节点的左右是否满足f(左)<根<f(右),不要过早就递归了,start>end这个递归条件用习惯了,以后要改。
2.这道题恰恰不能[b](递归终止)留到start>end,因为满足当前某个子树满足“性质”,但是它可能不满足 “父节点”的性质。[/b]
【7 4 6 5】
5 ---(7)(46) 在“单独”判断(46)两个节点时,已经不在乎他是否跟5有什么关系了。
总结:递归中不要过早return f(左)&&f(右) ,一般情况没有这么完备,还要分段考虑,这题左子树可能为空,右子树也可能为空,所以不要一想到二叉树递归就是 return f(左)&&f(右)
class Solution { public: bool VerifySquenceOfBST(vector<int> sequence) { if(sequence.empty()) return false; return isSquenceOfBST(sequence,0,sequence.size()-1); } bool isSquenceOfBST(vector<int>&sequence,int start,int end){ int i=start; for (; i < end; ++i) { if(sequence[i]>sequence[end]) break; } int j=i; for (; j < end; ++j) { if(sequence[j]<sequence[end]) return false; } bool left=true; if(i>start) //举例,如果是[10,7,5],左子树为空,所以左边返回true left=isSquenceOfBST(sequence,start,i-1); bool right=true; if(i<end) //举例,如果是[1,2,3,4],右子树为空,所以右边返回true right=isSquenceOfBST(sequence,i,end-1); return left&&right; } };
相关文章推荐
- 二叉搜索树的后序遍历序列
- 二叉搜索树的后序遍历序列
- Q24:二叉搜索树的后序遍历序列
- 输入一个数列,判断是否为某一个二叉搜索树的后序遍历序列
- 【剑指offer】二叉搜索树的后序遍历序列
- 二叉搜索树的后序遍历序列
- 1367:二叉搜索树的后序遍历序列 @jobdu
- 剑指offer:二叉搜索树的后序遍历序列
- 面试题整理7 二叉搜索树的后序遍历序列
- 【剑指offer】面试题24:二叉搜索树的后序遍历序列
- 判断一个整数数组是不是二叉搜索树的后序遍历序列
- 剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列
- 二叉搜索树的后序遍历序列
- 二叉搜索树的后序遍历序列
- 《剑指Offer》读书笔记---面试题24:二叉搜索树的后序遍历序列
- 判断一个整数数组是不是二叉搜索树的后序遍历序列
- 题目1367:二叉搜索树的后序遍历序列
- [剑指offer][面试题24]二叉搜索树的后序遍历序列
- 数据结构-二叉搜索树的后序遍历序列
- 通过二叉树的中序和后序遍历序列构造二叉树(非递归)