您的位置:首页 > 其它

二叉搜索树的后序遍历序列:递归中不要过早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;

}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: