這種遍歷法就比較好去想像,我們是一層一層的去印出節點內容
舉例來說,有一棵樹長這樣:
_1_
_3_ _7_
9 8 4 2
那經過 level order 得出的結果就是 1 3 7 9 8 4 2
今天的目標就是去完成 Hackerrank
上的 Level Order Traversal
這個演算法最大的難處是,我們怎麼保存每個節點的子節點?
從圖上可以看到,要輸出的下一個節點是在父節點的另一顆子樹,或是更遙遠。總不能每次都從根節點出發吧?
這題我們搭配的資料結構是佇列(Queue)!
def levelOrder(root):
if root is None:
return None
print(root.info, end = "")
queue = []
# 由於輸出格式,根節點需要另外處理
if root.left != None:
queue.append(root.left)
if root.right != None:
queue.append(root.right)
# 處理其他節點
while len(queue) != 0:
size = len(queue)
for i in range(size):
print("", queue[0].info, end = "")
if queue[0].left != None:
queue.append(queue[0].left)
if queue[0].right != None:
queue.append(queue[0].right)
queue.pop(0)