目录
💎一、题目
🏆1.题目描述
🏆2.原题链接
💎二、解题报告
🏆1.思路分析
🔑思路:
由于是二叉搜索树,所以左孩子<父亲<右孩子,所以我们先找到根节点数组的最后一个,然后找到比根大的数右孩子,那么有孩子和父亲之间的区间如果还有大父亲的值则说明不符合二叉搜索树的原则,否则左右子树递归
🏆2.代码详解
class Solution {
public:
bool verifyPostorder(vector<int>& postorder) {
return SearchverifyPostorder(postorder, 0, postorder.size()-1);
}
bool SearchverifyPostorder(vector<int>& postorder, int left, int right)
{
if(left >= right) //1
return true;
int root = postorder[right];
int mid = left;
while(root > postorder[mid]) //2
++mid;
int tmp = mid; //3
while(tmp < right)
if(postorder[tmp++] < root)
return false; //4
return SearchverifyPostorder(postorder, left, mid-1) && //SearchverifyPostorder(postorder, mid, right-1);
}
};
1.如果left大于right说明该区域找完了,如果left大于right说明该区域只有一个值
2.根据二叉搜索树的规则,左孩子<父亲<右孩子,所以知道后续遍历最后一个是根的情况,首先找到右孩子,根据规则右孩子大于父亲
3. 找到右孩子之后还需要判断[mid+1, right]之间是否还存在大于父亲的值,如果存在返回false
4.左右子区间递归