[leetcode] 255. Verify Preorder Sequence in Binary Search Tree解題レポート
タイトルリンク:https://leetcode.com/problems/verify-preorder-sequence-in-binary-search-tree/
Given an array of numbers, verify whether it is the correct preorder traversal sequence of a binary search tree.
You may assume each number in the sequence is unique.
Follow up: Could you do it using only constant space complexity?
考え方:現在の値の範囲を維持し、最初の最小最大はルートノードであり、左サブツリーの最小値が左端のノードを維持します.最初の増加ノードを見つけることで、前のノードが左サブツリーの最小値であり、つまりルートノードより小さいすべてのノードがそのノードより大きくなければなりません.
そして右サブツリーを巡ると、最大値と最小値を更新し続けます.現在のノードが最大値より大きい場合は、ルートノードの右端に移動したことを示します.最小値は最大値に更新され、最大値は現在のノードに更新されます.この場合、ノードの右サブツリーに遍歴しているため、この右サブツリーの最小値はルートノードです.
コードは次のとおりです.
Given an array of numbers, verify whether it is the correct preorder traversal sequence of a binary search tree.
You may assume each number in the sequence is unique.
Follow up: Could you do it using only constant space complexity?
考え方:現在の値の範囲を維持し、最初の最小最大はルートノードであり、左サブツリーの最小値が左端のノードを維持します.最初の増加ノードを見つけることで、前のノードが左サブツリーの最小値であり、つまりルートノードより小さいすべてのノードがそのノードより大きくなければなりません.
そして右サブツリーを巡ると、最大値と最小値を更新し続けます.現在のノードが最大値より大きい場合は、ルートノードの右端に移動したことを示します.最小値は最大値に更新され、最大値は現在のノードに更新されます.この場合、ノードの右サブツリーに遍歴しているため、この右サブツリーの最小値はルートノードです.
コードは次のとおりです.
class Solution {
public:
bool verifyPreorder(vector<int>& preorder) {
if(preorder.size() ==0) return true;
int Min = preorder[0], Max = Min;
for(int i = 1; i< preorder.size(); i++)
{
if(preorder[i] > preorder[i-1]) break;
Min = min(Min, preorder[i]);
}
for(int i = 0; i< preorder.size(); i++)
{
if(preorder[i] < Min) return false;
if(preorder[i] > Max)
{
Min = Max;
Max = preorder[i];
}
}
return true;
}
};
参照:https://leetcode.com/discuss/89904/52ms-c-o-1-space-o-n-time-commented-code