LeetCode: 107. 二叉樹的層次遍歷
給定一個二叉樹,返回其按層次遍歷的節點值。 (即逐層地,從左到右訪問所有節點)。
例如:
給定二叉樹: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
思路: 層次遍歷, 可用隊列 或 棧(保存每層記錄) 實現
定義並創建二叉樹:
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
'列表創建二叉樹'
def Create_tree(root,llist,i):
#創建過程也是從根開始a,創左子樹b,再創b的左子樹,如果b的左子樹爲空,返回none。
#再接着創建b的右子樹,
if i<len(llist):
if llist[i] ==None:
return None
else:
root=TreeNode(llist[i])
#往左遞推
root.left=Create_tree(root.left,llist,2*i+1)#從根開始一直到最左,直至爲空,
#往右回溯
root.right=Create_tree(root.right, llist,2*i+2)#再返回上一個根,回溯右,
#再返回根'
return root #這裏的return很重要
return root
隊列實現層次遍歷:
# 按層遍歷:從上到下、從左到右按層遍歷
# 先進先出選用隊列結構,::: 尾進頭出
import queue
#### 標準層次遍歷 返回結果: 【3,9,20,15,7】
def layerTraverse(head):
res = []
if not head: return res
que = queue.Queue() # 創建先進先出隊列
que.put(head)
while not que.empty():
head = que.get() # 彈出第一個元素並打印
res.append(head.val)
if head.left: # 若該節點存在左子節點,則加入隊列(先push左節點)
que.put(head.left)
if head.right: # 若該節點存在右子節點,則加入隊列(再push右節點)
que.put(head.right)
return res
棧(保存每層節點) 實現:
def layerTraverse2(head):
res=[]
if not head: return res
cur_level=[head]
while cur_level:
temp,next_level=[],[]
for node in cur_level:
temp.append(node.val)
if node.left:
next_level.append(node.left)
if node.right:
next_level.append(node.right)
res.append(temp)
cur_level=next_level
return res
測試代碼:
if __name__ =="__main__":
nums=[3, 9, 20, None, None, 15, 7]
root=Create_tree(None,nums,0)
# r=layerTraverse(root)
r = layerTraverse2(root)
print(r)