问题描述:
题解:
此题的基本是对一个二叉树进行层序遍历。
二叉树层序遍历可以通过队列实现:维护一个队列queue(python中通过list实现)和保存遍历结果的list res。
<1>如果根节点root不为空,则加入queue,初始化时queue中只有根节点一个。
<2>取出queue第一个节点记node
<3>将node.val加入res
<4>如果node左子节点不为空,加入queue。
<5>如果node右子节点不为空,加入queue。
<6>重复以上操作直到queue为空。
普通二叉树层序遍历实现代码如下:
class Solution(object): def levelOrder(self, root): queue = [] res = [] if root !=None: queue.append(root) while len(queue)!=0: node = queue[0] res.append(node.val) if node.left !=None: queue.append(node.left) if node.right != None: queue.append(node.right) del queue[0] return res
本题与普通的层序遍历相比特殊之处在于输出将每一层分别放在一个list中。关键在于将同一层的左右子节点加入同一个队列中,实现代码如下:
class Solution(object): def levelOrder(self, root): queue = [] res = [] if root !=None: queue.append(root) while len(queue)!=0: layer= [] layerres = [] for node in queue: layerres.append(node.val) if node.left !=None: layer.append(node.left) if node.right != None: layer.append(node.right) queue = layer res.append(layerres) return res
同样,维护一个队列queue,初始时只有根结点,一个记录结果的list res。增加两个list layer和layerres。分别记录每一层的节点和结果。
对queue每个节点node,将node.val加入layerres,node的左右子节点加入layer,然后将queue替换为layer。
以题目中二叉树为例:
<1>初始时queue只有root=3一个节点。
layer layerres res均为空。
<2>对root进行处理,layerres=[3],3的左右子节点加入layerres=[9,20]
queue=layerres=[9,20],res=[[3]]
<3>对queue的两个节点处理:
layerres=[9],9左右子节点均为空,layer=[]
layerres=[9,20],20左右子节点加入layer=[15,7]
res=[[3],[9,20]]
queue=layer=[15,7]
<4>此时queue中两个节点15和7的左右子节点均为空,res=[[3],[9,20],[15,7]]