題目
給定乙個整型陣列arr,已知沒有重複值,判斷arr是否可能是節點值型別為整型的搜尋二叉樹後序遍歷的結果。
高階問題:如果整型陣列中沒有重複值,且已知是一棵二叉搜尋樹的後序遍歷結果,通過arr重構二叉樹。
解答:二叉樹的後序遍歷是先左、再右、最後根的順序,所以,頭節點一定是陣列的最後乙個元素。根據搜尋二叉樹的性質,比後序陣列最後乙個元素值小的陣列會在陣列的左邊,比後序陣列最後乙個元素值大的陣列會在陣列的右邊。例如arr=【2,1,3,6,5,7,4】,比4小的為【2,1,3】(左子樹),比4大的為【6,5,7】(右子樹)。如果不滿足這種情況,那麼一定不是搜尋二叉樹的後序遍歷結果。接下來對這2個劃分的陣列遞迴進行上面的判斷即可。
**:
public
boolean
ispostarray
(int
arr)
return
ispost
(arr,
0, arr.length -1)
;}private
boolean
ispost
(int
arr,
int start,
int end)
int less =-1
;int more = end;
for(
int i =
0; i < end; i++
)else
}//只有左子樹或者只有右子樹的情況
if(less ==-1
|| more == end)
if(less != more -1)
return
ispost
(arr, start, less)
&&ispost
(arr, more, end -1)
;}
高階問題和原問題同理,陣列最後乙個元素為頭節點,左部分陣列是左子樹,右部分陣列是右子樹。
public treenode postarraytobst
(int
arr)
return
posttobst
(arr,
0, arr.length -1)
;}private treenode posttobst
(int
arr,
int start,
int end)
treenode head =
newtreenode
(arr[end]);
int less =-1
;int more = end;
for(
int i =
0; i < end; i++
)else
} head.left =
posttobst
(arr, start, less)
; head.right =
posttobst
(arr, more, end -1)
;return head;
}
根據後序陣列重建搜尋二叉樹
題目 給定乙個整型陣列arr,已知其中沒有重複值,判斷arr是否可能是節點值型別為整型的搜尋二叉樹後序遍歷的結果。public class ispostarray return ispost arr,0,arr.length 1 public static boolean ispost int ar...
根據後序陣列重建搜尋二叉樹
根據後序陣列重建搜尋二叉樹 給定乙個有 n 個不重複整數的陣列 arr,判斷 arr 是否可能是節點值型別為整數的搜尋二叉樹後序遍歷的結果。輸入描述 第一行乙個整數 n,表示陣列的長度。第二行 n 個整數 arr i。輸出描述 如果是搜尋二叉樹後序遍歷的結果則輸出 true 否則輸出 false 示...
根據後序陣列重建搜尋二叉樹
題目 根據後序陣列重建搜尋二叉樹 程式設計師 面試指南 第44題 p148 難度 士 原問題為判斷陣列arr是否可能是搜尋二叉樹後序遍歷的結果,高階問題為通過陣列arr重構二叉樹。原問題的解法 根據二叉樹後序遍歷的順序 左 右 根,頭節點的值一定是陣列的最後乙個元素。然後將除最後乙個元素的陣列一分為...