題目:[二叉搜尋樹的後續遍歷序列]
這個題目我覺得還是不錯的,自己起初沒有想出來。
其實主要是要結合後續遍歷的思路,序列中最後乙個節點一定是根。然後此時,考慮bst的性質,左子樹比根小,右子樹比根大。所以前面的序列也是一部分比根小,一部分比根大。並且這兩個序列都是完全連續的。
這題另外乙個總要思路就是對於樹這種遞迴結構,最常見的解決辦法是遞迴的方法。所以,一定要想到遞迴的思路,問題迎刃而解。這個題和知道前序和中序還原二叉樹是一樣的辦法。
遞迴的思路是這樣,原序列是bst的後序遍歷當且僅當前面一部分序列是左子樹後續遍歷序列,右子樹序列是後續遍歷序列。
這兩部分序列有乙個前提條件就是,左子樹全都比根小,右子樹全都比根大。但是反之不成,但是儘管反之不成,這也是乙個條件,即如果左子樹中存在乙個比根大,它一定不是合法的bst後續序列。右子樹同理,所以這個題我們把矛盾放到右子樹上面,只要找到第乙個比根大的我就認為這是右子樹開始的序列,那麼前面的部分是左子樹開始的序列。可以肯定的是,此時的左子樹一定是滿足全部小於根節點的,但是至於他到底是不是bst的後序遍歷序列,還需要再判斷。但是,此時右子樹不一定滿足全部比根大的條件,要先判斷,判斷完之後再進一部判斷它是不是bst的後續遍歷序列。
class solution
private:
bool helper( const
vector
& arr, int s, int t )// [s, idx - 1] - left
for(int j = idx + 1; j < t; ++j)// [idx, t-1] - right
return helper(arr, s, idx-1) && helper(arr, idx, t-1);}}
};
劍指offer 二叉搜尋樹的後續遍歷序列
輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。此題仍然是對二叉樹遍歷方法的考察,但是與直接對遍歷方法的考察不太一樣,因為這裡的輸入是後續遍歷的序列,所以要判斷該序列是否是某二叉樹的後續遍歷結果,關鍵在於找出根...
劍指Offer之 二叉搜尋樹的後續遍歷序列
輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後續遍歷的結果。根據二叉搜尋樹的後續遍歷結果的特點來判斷 序列的最後乙個數是根結點,且前面一部分的數 最後乙個數,根結點之前的後一部分數 最後乙個數。類似這樣的陣列 5,7,6,9,11,10,8 如果滿足上面的條件,然後再對兩部分進行遞迴判斷,否則直...
劍指offer 23 二叉搜尋樹的後續遍歷
程式設計資料獲取 codelab 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。我們先來了解一下什麼是二叉搜尋樹 二叉查詢樹 binarysearchtree 也稱為二叉搜尋樹 有序二叉樹或排序二叉樹是指一棵...