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

2021-10-21 02:38:31 字數 3016 閱讀 4767

擴充套件題:leetcode 1008. 前序遍歷構造二叉搜尋樹

舉一反三

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

5

/ \ 2

6/ \

13

示例 1:

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

輸出:false

示例 2:

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

輸出:true

陣列長度 <= 1000後序遍歷得到的序列中,最後乙個數字是樹的根節點的值。又由於是二叉搜尋樹且沒有重複數字,故陣列中前面的數字可以分為兩部分:第一部分是左子樹節點的值,它們都比根節點的值小;第二部分是右子樹節點的值,它們都比根節點的值大。

由此我們可以這樣做:

找到根節點

從頭遍歷當前區間中的值,找到第乙個不小於根節點的值,此時,該值左邊的數都小於根節點是根節點的左子樹,剩下的就應該是右子樹,右子樹中的值都需要大於根節點的,否則就不能構成二叉搜尋樹。

如陣列,後續遍歷最後乙個數字8就是根節點的值。前面5,7,6均小於8,是左子樹,此時我們判斷剩下的9,11,10是否都大於8,如果都大於8,說明他們可以作為根節點的右子樹。之後可以用同樣的方法確定與陣列每一部分對應的子樹的結構。這其實就是乙個遞迴的過程。

對於遞迴回溯,大家肯定都知道是什麼,看別人的**也基本可以看懂,但是自己去寫的時候,總感覺不是那麼回事。這就是對遞迴回溯的整個過程沒有思考清楚,本人建議可以自己多畫幾次遞迴回溯的流程圖,去思考清楚是怎麼回溯的,這樣自己寫的時候才能迅速的反應過來。記住一點,每一次遞迴都是呼叫了方法自身,都會開闢乙個新的方法棧,只有遇到return語句或者當前方法棧執行結束才會往回回溯。否則上一級棧會一直等著他的下一級棧回來。

}//遞迴判斷左右子樹是否也符合二叉搜尋樹的性質

返回與給定前序遍歷preorder相匹配的二叉搜尋樹(binary search tree)的根結點。

(回想一下,二叉搜尋樹是二叉樹的一種,其每個節點都滿足以下規則,對於node.left的任何後代,值總< node.val,而node.right的任何後代,值總> node.val。此外,前序遍歷首先顯示節點node的值,然後遍歷node.left,接著遍歷node.right。)

題目保證,對於給定的測試用例,總能找到滿足要求的二叉搜尋樹。

示例:

輸入:[8,5,1,7,10,12]

輸出:[8,5,10,1,7,null,12]

這就是劍指offer p182的相關題目,是上一題的擴充套件題,上題是判斷能否構成二叉搜尋樹,而這題是告知一定可以構成二叉搜尋樹,讓我們構造出該樹。其實就是換湯不換藥。思路與上題一致,這裡換成了前序遍歷罷了。為了加深對遞迴回溯的理解,仍然畫了乙個圖,以[8,5,1,7,10,12]為例。

如果面試題要求處理一棵二叉樹的遍歷序列,則可以先找到二叉樹的根節點,再基於根節點把整個樹的遍歷序列拆分為左右子串行,然後遞迴的處理這兩個序列。上面兩題都是這個思路,劍指offer 7. 重建二叉樹應用的也是該思路。

33 二叉搜尋樹的後序遍歷

二叉搜尋樹 任意節點,左子樹所有的節點比根節點小,右子樹的所有節點比根節點大。題目 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。思路 1。後序遍歷,先找到根節點,最後乙個數 2.判斷第乙個數是否小於根節點,...

ATO 33 二叉搜尋樹的後序遍歷序列

輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。例如 5,7,6,9,11,10,8 class solution bool verifysquenceofbstrecursively vector int s...

Q33二叉搜尋樹的後序遍歷序列

輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。二叉搜尋樹 上圖所示二叉搜尋樹 bst 的後序遍歷為 132 576 4 class solution if isrightsubtree 遞迴判斷左右子樹 re...