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

2021-10-07 16:44:46 字數 1048 閱讀 7437

這道題其實就是給你乙個序列讓你判斷一下可不可能是一棵二叉搜尋樹的後序遍歷的序列。以如下的搜尋樹為例:

首先第一種很容易想到的做法就是遞迴去做,因為根據後序遍歷的性質,序列的最後乙個元素就是二叉樹的根節點,找到根節點之後就可以根據二叉搜尋樹的性質去將序列一分為二,上圖中1 3 2這幾個節點的值都小於根節點的值5,所以全部劃分到左子樹,6的值大於根節點的值,所以劃分到右子樹。劃分好之後再遞迴就好了。

那麼單調棧應該如何使用呢?首先需要知道的是,是要後乙個元素大於前乙個元素,那麼後乙個元素就是前乙個元素的右子樹。那麼遍歷中一旦出現後乙個元素小於前乙個元素了,那麼就以為進入左子樹了,這個時候就可以去找到當前節點的根節點root,那麼怎麼找呢?方法就是如果下乙個元素比棧頂元素大,就壓棧;否則的話就將棧頂元素出棧直到棧空或者棧頂元素小於當前元素:

還是看上圖,最初我們將root的值初始化為無窮大,然後棧為空,序列為5 6 2 3 1

不斷壓棧,棧中元素為5, 6,直到2入棧,將棧頂元素彈出,每次彈出都將root設定為彈出值,可知最後棧為空,root值為5,然後將2入棧,現在棧中元素為2,剩下序列為3 1

然後再將3入棧,遇到1,在將棧中元素都彈出,然後root的值為2,再將1入棧,此時棧中元素為1,剩餘序列為空,結束。

如果在入棧過程**現當前元素比root大的時候,則表示出現了問題,返回false,**如下直接copy大佬的**:

class

solution

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 複製 首先先理解題意,映象通過以下幾個步驟可以實現 可以看到首先對根節點的左右進行翻轉。再遞迴的對左子樹,以及右子樹進行翻轉。之前講過,鍊錶的題目分為四...