Sword Finger Offer 33.バイナリ検索ツリー(C ++)のポストオーダートラバーサルシーケンス補助単調スタック+ポストオーダートラバーサル逆順

整数配列を入力して、その配列が二分探索木のポストオーダートラバーサルの結果であるかどうかを判別します。そうである場合は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)
著作権は作者に帰属します。商用の転載の場合は、著者に連絡して許可を求め、非商用の転載の場合は、出典を示してください。

おすすめ

転載: blog.csdn.net/qq_30457077/article/details/114988663