劍指Offer 33 二叉搜尋樹的後序遍歷序列

2022-06-06 11:06:10 字數 949 閱讀 5775

輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷結果。如果是則返回 true,否則返回 false。假設輸入的陣列的任意兩個數字都互不相同。

輸入:[1,6,3,2,5]

輸出:false

輸入:[1,3,2,6,5]

輸出:true

class solution 

bool recur(int i, int j)

};

二叉搜尋樹的後序遍歷特點為:假設遍歷序列的長度為i,則最右端為根節點,從左到右遍歷,設第乙個大於根節點的位置為m,則[0, m-1]部分為左子樹,[m, i - 2]部分為右子樹。遞迴終止條件有兩個,當遍歷序列長度小於等於2時,必定符合要求;當右子樹部分出現小於根節點的值時,必定不符合要求(在確定左子樹時已經保證了那些值都小於根節點,所以只需要驗證右子樹就行)。

class solution 

s.push(postorder[i]);

}return true;

}};

這裡先說一下使用前中後序遍歷驗證二叉搜尋樹的做法。中序遍歷最簡單,只需要看遍歷序列是不是嚴格單調遞增就行;前序遍歷使用遞迴和單調棧的做法很常見;而後序遍歷的倒序是前序遍歷的變種(根右左),同樣也能使用單調棧。

這裡說明前序遍歷的單調棧做法。根據二叉搜尋樹的定義,左子樹小於根節點。我們使用乙個單調遞減的單調棧,當遍歷指向的元素大於棧頂值時,單調棧中存放的是該節點所有可能的根節點,棧中最後乙個小於該節點的元素即其對應的根節點值。我們需要暫存這個根節點值,當這個根節點的右子樹出現小於該暫存值的元素時,說明這不是二叉搜尋樹。

劍指offer 33 二叉搜尋樹的後序遍歷

題目描述 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。思路 遞迴。最後乙個數字是樹的根節點,第一部分是左子樹節點的值,都比根節點小。第二部分是右子樹節點的值,都比根節點大。class solution de...

劍指Offer 33 二叉搜尋樹的後序遍歷

由於是後序遍歷,所以陣列最後乙個元素是根節點 遞迴開始傳入起始元素 和 末尾元素 當起始索引 left right 結束遞迴 執行迴圈,找到第乙個比根節點大的元素 temp 它的左面是樹的左子樹,右面到根節之間是樹的右子樹 判斷temp 到 root 之間的結點是否全部大於根節點 進行下一次遞迴,直...

劍指offer 33 二叉樹映象

操作給定的二叉樹,將其變換為源二叉樹的映象。二叉樹的映象定義 源二叉樹 8 6 10 5 7 9 11 映象二叉樹 8 10 6 11 9 7 5 複製 首先先理解題意,映象通過以下幾個步驟可以實現 可以看到首先對根節點的左右進行翻轉。再遞迴的對左子樹,以及右子樹進行翻轉。之前講過,鍊錶的題目分為四...