【題目】
定義二叉樹節點如下:
乙個陣列的maxtree定義如下:class
node:
def__init__
(self, value):
self.value = value
self.left = none
self.right = none
1、陣列中必須沒有重複元素
2、maxtree是一棵二叉樹,陣列的每乙個值對應乙個二叉樹的節點
3、包括maxtree樹在內且在其中的每一棵子樹上,值最大的節點就是樹的頭。
給定乙個沒有重複元素的陣列arr,寫出生成這個陣列的maxtree的函式,要求如果陣列長度為n,則時間複雜度為o(n)、額外空間複雜度為o(n)。
【基本思路】
使用以下原則建立這棵樹:
1、每乙個數的父節點是它左邊第乙個比它大的數和它右邊第乙個比它大的數中,較小的乙個。
2、如果乙個數左邊沒有比它大的數,右邊也沒有,那麼這個數就是整個陣列中的最大值,那麼這個數是maxtree的頭節點。
接下來的只要知道每乙個數左邊比它大的數以及右邊比它大的數,剩下的工作就很好實現了。如何實現呢?使用棧。
從左到右遍歷陣列arr,假設遍歷到的位置為i,如果棧為空或者棧頂元素大於arr[i],直接將arr[i]壓入棧中;否則將棧中小於arr[i]的元素全部出棧,然後壓入arr[i]。同時,棧中元素的左邊第乙個比它大的數就是它相鄰的數,右邊第乙個比它大的數就是使它出棧的數,如果沒有數使它出棧,說明它右邊沒有比它大的數。
以[3,1,2]為例,首先3入棧,接下來1比3小,直接入棧,並且確定了1左邊第乙個比它大的數是3;接下來2比1大,1出棧,同時可以確定1右邊第乙個比它大的數是2;接下來2比3小,2入棧,並且確定了2左邊第乙個比它大的數是3。此時棧中的元素為[3,2],沒有數使它們出棧,所以3和2右邊都沒有比它大的數。
【**實現】
#python3.5
class
node:
def__init__
(self, value):
self.value = value
self.left = none
self.right = none
defgetmaxtree
(arr):
narr = [node(arr[i]) for i in range(len(arr))]
lbigmap = {}
rbigmap = {}
stack =
for i in range(len(narr)):
curnode = narr[i]
while stack and stack[-1].value < curnode.value:
cur = stack.pop()
lbigmap[cur] = stack[-1] if stack else
none
rbigmap[cur] = curnode
while stack:
cur = stack.pop()
lbigmap[cur] = stack[-1] if stack else
none
rbigmap[cur] = none
head = none
for i in range(len(narr)):
curnode = narr[i]
left = lbigmap[curnode]
right = rbigmap[curnode]
if left == none
and right == none:
head = curnode
elif left == none:
if right.left == none:
right.left = curnode
else:
right.right = curnode
elif right == none:
if left.left == none:
left.left = curnode
else:
left.right = curnode
else:
parent = left if left.value < right.value else right
if parent.left == none:
parent.left = curnode
else:
parent.right = curnode
return head
陣列和棧,佇列
push 用於在array結尾新增乙個或多個項,pop 方法用於刪除最後乙個陣列項 length 1 返回它作為函式值 shift 將刪除陣列中的第乙個項,將其作為函式值返回 另乙個方法是unshift 方法,它把乙個項放在陣列的第乙個位置,然後把餘下的項向下移動乙個位置 var a a b c d...
棧和佇列的陣列表示
棧和佇列 都是動態集合,且在其上進行delete操作所移除的元素都是預先設定的。在棧 stack 中,被刪除的都是最近插入的元素 棧實現的是一種後進先出的策略。類似的,在佇列中,被刪除的總是在集合中存在時間最長的那個元素 佇列實現的是一種先進先出的策略。在計算機上實現棧和佇列有好幾種有效方式。本文將...
javaScript陣列中的棧和佇列
棧方法 棧是一種lifo last in first out,後進先出 的資料結構。其實通俗的講就是最新新增的項最早被移除。而棧中項的插入 叫做推入 和移除 叫做彈出 只發生在乙個位置 棧的頂部。在ecmascript中陣列也提供了讓它類似於其他資料結構的方法。具體來說,陣列可以表現得像棧一樣。還是...