题目:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
如果是则返回true,否则返回false。
假设输入的数组的任意两个数字都互不相同。
样例
输入:[4, 8, 6, 12, 16, 14, 10]
输出:true
做题思路:
首先问的是后序遍历结果,那么我们要知道什么是后序遍历 左右根 ,故而,序列最后一个肯定是根节点。
其次 二叉搜索树 ,也就是左子树均小于根节点,右子树的结点均大于根节点。
最后这肯定是bool 判断才有true false.
class Solution {
public:
vector<int> seq; //设定一个全局变量seq,方便后面使用
bool verifySequenceOfBST(vector<int> sequence) {
seq = sequence ;
return dfs(0,seq.size() -1);//最开始左右边界;
}
bool dfs(int l , int r )
{
if(l>=r) return true;//如果左大于根,为空 或者只有一个根节点,合法
int root = seq[r];//此时根节点便是序列最右侧,因为后序遍历是左右根,最后一个肯定是根节点。
int k = l;
//下面遍历出左子树,只要是K比最右侧小,结点的数值也小于根节点,那么K累加,循环出来的就是左子树
while(k < r && seq[k] < root) k++;
//下面看看右子树是否合法,也就是右子树里面的数值是不是有比根节点小,如果有就是false非法也~
for(int i=k ;i<r;i++)
if(seq[i]<root)
return false;
return dfs(l,k-1) && dfs(k,r-1);//特别注意:最后是返回的左右子树的边界,这个范围一定不能错,特别是右子树是从K到R-1,没有r,因为r是根节点啊。
}
};
特别提醒:这个K,一定要注意,最后他到底是左子树的还是右子树的要清楚,清楚while循环累加后的K
举例子:
while 的判断中如果a 为4 ,也会继续执行 a++,那么出来的就是下一个,所以,k 出来的就是右子树第一个。所以,最后dfs 右子树的范围为(k,r-1)。如何这个范围错了,你真的会疯的的~