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)4 **優化else
}for(int i = position + 1; i1; i++)
if(!leftsequence.empty())
if(!rightsequence.empty())
return
true
;
}
判斷語句太多,後邊看看能不能合併一些,簡化一下,裡邊肯定有冗餘的判斷。
二叉搜尋樹的後序遍歷序列
題目 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是返回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...