劍指Offer刷題筆記 從上往下列印二叉樹

2021-09-25 23:58:39 字數 1531 閱讀 1397

從上往下列印出二叉樹的每個節點,同層節點從左至右列印。

其實這就是廣度搜尋。

與廣度搜尋對應的是深度搜尋,所謂深度搜尋就是前序遍歷,除了常見的遞迴實現之外,還可以利用棧來實現:利用,先將根入棧,再將根出棧,並將根的右子樹,左子樹存入棧,按照先進後出規則來實現深度優先遍歷。深度優先搜尋不能用都佇列來實現,比如乙個結點出佇列了,它的子樹在隊尾入佇列,就不能緊接著出佇列了。

def dfs_stack(self,root):      #基於棧資料結構實現的深度遍歷        

if root == none:

return

stack =

while stack:

now_node = stack.pop()

print(now_node.data)

if now_node.right != none:

if now_node.left != none:

相對的廣度優先搜尋就是層次遍歷,所謂層次遍歷就是把一棵二叉樹當成千層餅,吃的時候是一層一層的吃。

廣度搜尋可以用佇列實現,廣度優先搜尋首先是上面的層要先輸出,所以處在上面的要先進佇列。在同一層中,左邊的結點要先輸出所以同一層裡左邊的結點要先進佇列。

這個過程,進出佇列是同時進行的。乙個結點出佇列,它的兩個子結點(不管是不是空結點)就進佇列。

這個過程怎麼理解? 乙個結點在它自己這層的出佇列次序,代表著它的子結點在下一層的出佇列次序。如果把出對列和入佇列看成一次遍歷的話,父節點出佇列的同時,子結點就應該入佇列。

換句話解釋:如果這個佇列只入佇列不出佇列,當一層入完了,下一層該怎麼入?應該是把上一層的結點再找出來,依次把他們的子結點在入佇列。這個再找出來的操作就是出佇列。

def printfromtoptobottom(self, root):        

# write code here

# 儲存數值的佇列

res =

# 儲存結點的佇列

queue = [root]

while queue:

node = queue.pop(0)

# 因為不是完全二叉樹,有空的跳過

if node == none:

continue

# 子結點入佇列

queue += [node.left, node.right]

return res

劍指offer刷題筆記

給定一顆二叉搜尋樹,請找出其中的第k大的結點。例如,5 3 7 2 4 6 8 中,按結點數值大小順序第三個結點的值為4。struct treenode class solution treenode kthnode treenode proot,int k 非遞迴實現 class solution...

劍指offer 程式設計題23(從上往下列印二叉樹)

public static class binarytreenode這道題實質是考查樹的遍歷演算法。從上到下列印二叉樹的規律 每一次列印乙個結點的時候,如果該結點有子結點,則把該結點的子結點放到乙個佇列的末尾。接下來到佇列的頭部取出最早進入佇列的結點,重複前面的列印操作,直至佇列中所有的結點都被列印...

劍指offer刷題

面試題6 從尾到頭列印鍊錶 struct listnode class solution reverse res.begin res.end return res 替換空格class solution int newnumstr numstr numspace 2 if newnumstr leng...