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)