劍指offer複習系列 樹題目一網打盡!(一)

2021-10-04 21:05:19 字數 1666 閱讀 5267

這道題的思路很簡單:

初始化佇列queue=[root], 列表res=while佇列非空:

移除佇列中第乙個結點,並將其值加入到res中

將其左右子結點(如有)加入到佇列中

返回res

這裡主要有兩個疑惑:

a:第一,因為這是我們正在操作的結點;第二,這裡的「移除第乙個」和「子結點加入佇列尾部」保證了第n+1層的結點一定是在第n層後面。

a:主要因為「移除第乙個結點」,如果用列表的pop(0)也可以做到,但此時時間複雜度為o(n)。而用佇列的popleft()只有o(1)

**如下:

class

solution

:def

levelorder

(self, root: treenode)

-> list[

int]:if

not root:

return

queue, res = collections.deque(),

while queue:

node = queue.popleft(

)if node.left:

if node.right:

return res

一般來說dfs有兩種寫法:遞迴和非遞迴

遞迴的思想是:

如果訪問結點為空,則return

訪問結點,將其值加入列表res中,並對其左子結點和右子結點遞迴呼叫dfs(如果沒有子結點,在訪問這些子結點時會return)

class

solution

:def

levelorder

(self, root: treenode)

-> list[

int]

:def

dfs(root):if

not root:

return

dfs(root.left)

dfs(root.right)

res =

dfs(root)

return res

非遞迴的思想是:

初始化乙個棧stack=[root]和結果列表res

while棧不為空:

將棧頂結點彈出,並將其值插入res中

將該結點的左、右子結點(如有)以右結點、左結點的順序插入到棧中

返回res

這裡主要有乙個疑惑:

這是因為棧的性質為**先出,根據dfs的性質,我們在訪問完乙個結點後,應該從該結點的左結點(如有)開始訪問。

class

solution

:def

levelorder

(self, root: treenode)

-> list[

int]:if

not root:

return

stack, res =

[root],[

]while stack:

node = stack.pop(

)if node.right:

if node.left:

return res

劍指offer題目

在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非減排序的陣列的乙個旋轉,輸出旋轉陣...

劍指offer題目系列三(鍊錶相關題目)

9 o 1 時間內刪除鍊錶結點 題目 在o 1 時間內刪除鍊錶結點。給定單鏈表的頭指標和乙個結點指標,定義乙個方法在o 1 時間內刪除該結點。單鏈表的定義如下 解答 單向鍊錶刪除乙個結點,最直觀的想法是從鍊錶的頭結點開始順序遍歷查詢要刪除的結點,然後刪除該結點,這種做法的時間複雜度為o n 顯然不滿...

劍指OFFER 題目review

劍指offer ac 三道題,現在review下 題目一 從尾到頭列印鍊錶 輸入乙個鍊錶,按煉錶值從尾到頭的順序返回乙個arraylist。我的思路 1.鍊錶值從頭到尾順序放入vector中 2.逆序vector 實現 class solution int size data.size for in...