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

2022-04-27 11:00:08 字數 1205 閱讀 9603

0 引言

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

二叉搜尋樹的概念:若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;

它的左、右子樹也分別為二叉排序樹。

二叉搜尋樹的基本性質:中序遍歷非嚴格單調遞增

1 抽象問題具體化

舉例1:判斷序列是否是二叉搜尋樹的後序遍歷序列.

1)4是根結點,以根結點為基準,將序列二分,左子樹為從左到右直到某個數大於4為止;右子樹為從該數到倒數第二個數為止,

同時對這其中的每個數進行判斷,必須每個數都大於4才可以,對當前樹的有效性作出判斷。

2)對子樹作同樣的劃分,劃分的基準變為每個子樹序列的最後乙個結點,左子樹為3,右子樹為6。

3)結束的條件是劃分到的子樹為空。

判斷結論為true.

2 具體問題抽象分析

採用遞迴的方式逐級進行判斷。

1)判斷序列是否為空,空的話返回true.

2)以序列的最後乙個結點為基準對序列進行劃分,從左到右小於等於基準的數入左子樹後序遍歷序列,其他數入右子樹後序遍歷序列,將其他數入隊時判斷其是否大於基準數,如果存在不大於基準數的情況,返回false.

3)  左子樹後序遍歷序列遞迴,如果未返回false,右子樹後序遍歷序列遞迴,得到返回值.

4)return bool.

3 demo

bool verifysquenceofbst(vectorsequence)                 

else

}for(int i = position + 1; i1; i++)

if(!leftsequence.empty())

if(!rightsequence.empty())

return

true

;

}

4 **優化

判斷語句太多,後邊看看能不能合併一些,簡化一下,裡邊肯定有冗餘的判斷。

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

題目 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是返回true,否則返回false。假設輸入的陣列的任意兩個數字都不相同。解答 二叉搜尋樹後序遍歷最後訪問的是根節點,根據根節點將陣列分成兩部分,前面一部分即左子樹值小於根節點值,後面一部分即右子樹的值大於根節點 再遞迴的檢查...

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

輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。include using namespace std bool verifysquenceofbst int sequence,int length int j...

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

輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。class solution 在二叉搜尋樹中右子樹的結點大於根結點 int j i for j0 left verifysquenceofbst lefttree...