這道題的思路很簡單:
初始化佇列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...