有乙個二叉樹,長這樣
1
/ \
2 3
/ \ / \
4 5 6 7
/ \ / \ / \ / \
8 9 . . . . . .
寫乙個函式,返回所有節點深度值的和。
其中節點深度是乙個節點到根節點的距離,在這裡舉個例子,根節點是1 ,那麼值為2 的節點到根節點的距離是1.
此時應該得到的sum的結果是16。
可以使用乙個堆疊結構,首先將根節點以及他的深度depth的鍵值對儲存到堆疊中。
這裡乙個對子是乙個字典物件,乙個個的字典物件儲存在乙個stack的列表裡。
首先pop出乙個元素,將這個元素的深度累加到計數器中,
在字典中記錄下他的兩個孩子的相同資訊,顯然此時兩個孩子的depth相對於這個節點都要+1,如此往復,直到堆疊為空。
#build tree
defnodedepths
(root)
: sum_of_depth =
0 stack =
while
len(stack)
>0:
node_profile = stack.pop(
) node,depth = node_profile[
"node"
],node_profile[
"depth"
]if node is
none
:continue
print
(f"當前處理節點"
) sum_of_depth += depth
)if node.left is
notnone
:print) )
if node.right is
notnone
:print
)print
(stack)
return sum_of_depth
# this is the class of the input binary tree.
class
binarytree
:def
__init__
(self, value)
: self.value = value
self.left =
none
self.right =
none
a = binarytree(1)
b = binarytree(2)
c = binarytree(3)
a.left = b
a.right = c
d = binarytree(4)
e = binarytree(5)
b.left = d
b.right = e
f = binarytree(6)
g = binarytree(7)
c.left = f
c.right = g
h = binarytree(8)
i = binarytree(9)
d.left = h
d.right = i
print
(nodedepths(a)
)# output_array =
# print(a.breadthfirstsearch(array = output_array))
### time: o(v+e) v是圖的頂點(vertics),e是圖的edge
### space: o(v) v是返回的array的長度
# for index,element in enumerate(["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"]):
# print(f" = binarytree(\"\")")
# que = [1,2,3,4,5]
# print(que.pop(0))
當前處理節點1[,
]當前處理節點3[,
,]當前處理節點7[,
,,]當前處理節點6[,
,]當前處理節點2[,
]當前處理節點5[,
,]當前處理節點4[,
]當前處理節點9[,
,]當前處理節點8[,
]16[finished in
0.6s]
可以看到stack需要的儲存空間和數的高度一致。 python的字典樹
coding utf 8 字典樹測試 python沒有指標,但是可以用巢狀字典來實現樹結構.對於非ascii的單詞,統一用unicode編碼來插入與搜尋.classtrienode 這是節點 def init self 定義節點的資料結構,並初始化,設定標誌位判斷是否單詞是否是完整的存在於字典樹中 ...
python遍歷目錄樹
假定你希望對某個資料夾中的所有檔案改名,包括該資料夾中所有子資料夾中的所有檔案。也就是說,你希望遍歷目錄樹,處理遇到的每個檔案。寫程式完成這件事,可能需要一些技巧。好在,python 提供了乙個函式,替你處理這個過程。請看 c delicious 資料夾及其內容,如圖 9 1 所示。這裡有乙個例子程...
字首樹python實現
file name 字首樹.py class trienode object def init self self.path 0 路過此節點幾個 self.end 0 以此為結尾的幾個 self.map none for i in range 26 每乙個節點有26條路 class trie obj...