输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树:
5
/ \
2 6
/ \
1 3
示例 1:
输入: [1,6,3,2,5]
输出: false
示例 2:
输入: [1,3,2,6,5]
输出: true
思路是参考评论区大佬的单调栈 确实非常巧妙
主要思想就是利用二叉排序树所有右子树都比左子树数要大的思想
bool verifyPostorder(vector<int>& postorder) {
stack<int> st;
int pre = INT_MAX;
// 倒序遍历数组 实现root -> right -> left的顺序 下面的代码判断何时right -> left
for(int i = postorder.size() - 1; i >= 0; i--){
if(postorder[i] > pre)return false;
// 一旦比栈顶元素大 就说明转入了左子树
while(!st.empty() && postorder[i] < st.top()){
pre = st.top();
st.pop();
}
st.push(postorder[i]);
}
return true;
}