题目:
有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。
给定二叉树的根结点root,请返回打印结果,结果按照每一层一个数组进行储存,所有数组的顺序按照层数从上往下,且每一层的数组内元素按照从左往右排列。保证结点数小于等于500。
测试用例:
输入:{1,2,3,4,5}
输出:[[1],[2,3],[4,5]]
思路:
层次遍历首先想到的就是用队列完成。初始时队列中只有根节点,当队列不为空时:每次队头结点出队,左右孩子(不为空时)入队。重复这一过程得到层次遍历的结果。但是该题要求将结点属于哪一层的信息也打印出来。
我们可以在层次遍历的过程中用两个结点标记某一层的最右结点和下一层的最右结点,分别命名为last和nlast。当队头结点出队时,如果它是最右结点,说明该层已经打印完了,队列中剩余的应该是下一层的结点。此时last = nlast,然后继续出队并判断。至于nlast的更新,我们只需要每入队一个结点,就把nlast更新为该结点即可,因为上一层的结点出队时,一定会把左右孩子入队,当上一层的最右结点出队时,nlast一定是下一层的最右结点。
代码:
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class TreePrinter:
def printTree(self, root):
# write code here
ans = [[]]
last, nlast = root, None
q = [root]
while q:
top = q.pop(0)
ans[-1].append(top.val)
if top.left:
nlast = top.left
q.append(top.left)
if top.right:
nlast = top.right
q.append(top.right)
if top == last:
ans.append([])
last = nlast
return ans[:-1]