1. 程式人生 > >[劍指offer] 二叉搜索樹的後序遍歷序列

[劍指offer] 二叉搜索樹的後序遍歷序列

mar 註意 solution size 新建 div 否則 ext 若有

題目描述

輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。


二叉搜索樹:(若有)左子樹全部結點小於根節點,(若有)右子樹全部結點大於根節點。

因此若一個數組為二叉搜索樹的後序遍歷,則最後一個元素為根節點,前面的元素以某處分開前半部分全部小於此數,後半部分全部大於此數,且這兩個部分又分別為一個二叉搜索樹。

然而因為內存限制,不能直接遞歸調用給出的函數,而是新建一個有傳值坐標的遞歸函數。

還要註意,二叉搜索樹不能為空

class Solution {
public:
    bool
VerifySquenceOfBST(vector<int> sequence) { if (sequence.size() == 0) return false; // 搜索樹不能為空 return VerifySquenceOfBST(sequence, 0, sequence.size() - 1); } bool VerifySquenceOfBST(vector<int> sequence, int beginPos, int endPos) { // 由於空間限制重寫一個具有pos傳值的函數而不是直接遞歸調用原函數
if (endPos - beginPos <= 1) return true; int root = sequence[endPos]; int rightPos = beginPos; while (sequence[rightPos] < root) rightPos++; bool rightIsRight = true; for (int i = rightPos; i < endPos; i++) { if (sequence[i] < root) { rightIsRight
= false; break; } } if (!rightIsRight) return false; return VerifySquenceOfBST(sequence, beginPos, rightPos - 1) && VerifySquenceOfBST(sequence, rightPos, endPos - 1); } };

[劍指offer] 二叉搜索樹的後序遍歷序列