整数配列を入力して、その配列が二分探索木のポストオーダートラバーサルの結果であるかどうかを判別します。そうである場合はtrueを返し、そうでない場合はfalseを返します。入力配列内の任意の2つの数値が互いに異なると仮定します。
次の二分探索木を参照してください。
5
/ \
2 6
/ \
1 3
例1:
输入: [1,6,3,2,5]
输出: false
例2:
输入: [1,3,2,6,5]
输出: true
ヒント:
配列の長さ<= 1000
問題解決のアイデア:
class Solution {
public:
bool verifyPostorder(vector<int>& postorder) {
stack<int> stack;//借助一个单调栈 stack 存储值递增的节点;
int root = INT_MAX;
for(int i = postorder.size() - 1; i >= 0; i--) {
if(postorder[i] > root) return false;//因为右子树时,root==INT_MAX
//不会更新root的值,左子树时才可以更新root的值
while(!stack.empty() && stack.top() > postorder[i])
//每当遇到值递减的节点ri ,则通过出栈来更新节点 ri 的父节点 root ;
//大于且最接近 ri的节点
//栈非空 且 栈顶大于当前数组元素
{
root = stack.top();//取栈顶值
stack.pop();//出栈
}
stack.push(postorder[i]);//每一个元素都入栈
}
return true;//遍历数组后,若无异常就是二叉搜索树
}
};
複雑さの分析:
時間計算量O(N):ポストオーダーのすべてのノードをトラバースし、O(N)時間を使用して、各ノードを1回プッシュ/ポップします。
スペースの複雑さO(N):最悪の場合、単調なスタックはすべてのノードを格納し、O(N)の余分なスペースを使用します。
著者:jyd
リンク:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof/solution/mian-shi-ti -33-er-cha-sou-suo-shu-de-hou-xu-
bian -6 /出典:LeetCode(LeetCode)
著作権は作者に帰属します。商用の転載の場合は、著者に連絡して許可を求め、非商用の転載の場合は、出典を示してください。