題目描述
輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。
方法一(遞迴)
後續遍歷得到的序列中最後乙個元素一定是樹的根節點的值。陣列中前面的數字可以分為兩部分:左子樹的值序列和右子樹的值序列。左子樹值都小於根節點值,右子樹值都大於根節點值。
確定了左子樹值和右子樹值的序列,還是按上面的方法確定對應的子樹的結構,這是乙個遞迴的過程。如果遞迴過程中發現其右子串行中有值小於根值,那麼這不是乙個後序序列。
public
boolean
verifysquenceofbst
(int
sequence)
else
if(sequence.length ==1)
return
judgepostorder
(sequence,
0, sequence.length -1)
;}public
boolean
judgepostorder
(int
sequence,
int start,
int end)
int i = start;
while
(i <= end && sequence[i]
< sequence[end]
)for
(int j = i; j <= end; j++)}
return
judgepostorder
(sequence, start, i -1)
&&judgepostorder
(sequence, i, end -1)
;}
方法二(非遞迴)
非遞迴也是乙個基於遞迴的思想:
左子樹一定比右子樹小,因此去掉根後,數字分為left,right兩部分,right部分的最後乙個數字是右子樹的根,它比左子樹所有值大,因此我們可以每次只看有子樹是否符合條件即可。即使到達了左子樹,左子樹也可以看出由左右子樹組成的樹還像右子樹那樣處理。對於右子樹,左子樹的所有值都比右子樹的根小可以暫時把他看出右子樹的左子樹,只需看看右子樹的右子樹是否符合要求即可。
public
boolean
verifysquenceofbst_2
(int
sequence)
else
if(sequence.length ==1)
int size = sequence.length -1;
int i =0;
while
(size >0)
;while
(sequence[i]
> sequence[size])if
(i < size)
i =0;
size--;}
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...