二叉搜索树的后序遍历序列
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
解题思路:
所给序列是二叉搜索树的后续遍历,其实就可以确定树的形态了,因为比根节点大的都是右子树节点,比根节点小的都是左子树节点,但是满足一个重要性质:左子树的子节点的最大值需要比根节点小,右子树的子节点最小值需要比根节点大。需要判断祖父节点跟当前节点的大小关系。
class Solution { public: bool MyVerify(vector<int>seq, int p, int pp, int l, int r){ if(r < l){ return true; } int i; for(i=l; i <= r; i++){ if(pp > p){ //left //max(v) < pp if(seq[i] > pp){ return false; } }else{ //right //min(v) > pp if(seq[i] < pp){ return false; } } } for(i=l; i <= r; i++){ if(seq[i] > p){ break; } } bool lres = true; if(i-2 >= l){ lres = MyVerify(seq, seq[i-1], p, l, i-2); } bool rres = true; if(r-1 >= i){ rres = MyVerify(seq, seq[r], p, i, r-1); } if(lres && rres){ return true; }else{ return false; } } bool VerifySquenceOfBST(vector<int> sequence) { int l = 0; int n = sequence.size(); for(int i=0; i < n-1; i++){ if(sequence[i] > sequence[n-1]){ l = i; break; } } bool lres = true; if(l-1 >= 0){ lres = MyVerify(sequence, sequence[l-1], sequence[n-1], 0, l-2); } bool rres = true; if(l <= n-2){ rres = MyVerify(sequence, sequence[n-2], sequence[n-1], l, n-3); } if (lres && rres){ return true; }else{ return false; } } };
学学学 练练练 刷刷刷