剑指offer第23题(c#)
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。(ps:我们约定空树不是二叉搜素树)
后序遍历就表示最后一个数字是根节点,其中有一个位置是之前的所有数字都小于这个最后的根节点,这个位置之后所有的数字都大于这个最后的根节点,因此我们可以利用这个逻辑来进行递归实现判断,左边的再递归查询一次右边的也递归查询一次,直到最后递归到两边的叶子节点相等就说明这个后序遍历是二叉搜索树。
这道题目的思路我没有按照自己代码想法写出来,测试的时候总有一个小bug导致没能全部通过,但是思想和逻辑是比较清晰的,写了一晚上我最终还是放弃了,参考了别人代码,简单讲解一下逻辑和语法吧,题解是很清晰的但是就是感觉有个地方的索引有bug查不出来,就参考别的人代码写一份注释吧;
下面展示一些 内联代码片
。
public bool VerifySquenceOfBST (List<int> sequence) {
// write code here
if(sequence.Count==0)
return false;
return res(sequence, 0, sequence.Count-1);
}
public bool res(List<int> a,int i ,int j){
if(i>=j)//如果递归到了相等的时候则说明是二叉搜索树
return true;
int p = i;//将第一个索引赋值给p来遍历判断出第一个大于根节点的树,即之后都是根节点的右子节点都比它大
while(a[p]<a[j])
p++;
int m = p;//找到之后赋值给m记录这个索引
while(a[p]>a[j])//之后便是将右边所有的数字比较看是否都比根节点大,如果中间有比根节点小的则返回那个更小的索引,如果没有则一直遍历到最后一个索引即根节点本身。
p++;
return p==j && res(a,i,m-1)&&res(a,m,j-1);
//最后左右两边子树递归判断,和是否这次递归中判断出有没有错误。
}