题目描述
1.从上往下打印出二叉树的每个节点,同层节点从左至右打印。([1,2,3,4,5,6,],无需保存行号)
2.有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。([[1][2,3],[4,5,6]],按照层数打印)
给定二叉树的根结点root,请返回打印结果,结果按照每一层一个数组进行储存,所有数组的顺序按照层数从上往下,且每一层的数组内元素按照从左往右排列。保证结点数小于等于500。
按照层数打印二叉树,需要保证每一层打印完之后再打印其对应的子节点。我们可以采用队列结构,将当前层(父节点)入队,每出队一个便打印出来,同时将其子节点入队。若在打印时保存树的深度,保持原来的相对形状打印(2),需要记录换行处。我们可以使用两个指针,一个指向换行处节点last,另一个指向最近添加的节点now。如果pop的节点==其换行处节点,则更新换行节点为下一行的换行节点=now。具体操作:
1.初始化时,last=1,把1放入队列;
2.将1出队,把1的子孩子2,3放入队列,更新now=3;
3.nlast更新完之后,打印上一次出队的1,并和last比较,如果相同就打印换行,并更新last=now=3;
4.将2出队,把2的子孩子4放入队列,更新now=4;
5,nlast更新完以后,打印上一次出队的2,并和last(3)比较,不相同,continue;
6.将3出队,将3的子孩子5,6放入队列,更新now=6;
7.nlast更新完以后,打印上一次出队的3,并和last(3)比较, 相同就打印换行,并更新last=now=6;
…………
总结就是如下循环:(初始化last=根节点,根节点入队)
while(队列不空)
1.将A出队,并将A的子孩子入队(判断是否存在再入队),更新now=A最后入队的子孩子;
2.打印上次出队的家伙A,并和last比较, 如果相同就打印换行,并更新last=now,如果 不相同,则continue
题目一:
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回从上到下每个节点值列表,例:[1,2,3]
def PrintFromTopToBottom(self, root):
last = root
now = root
if root is None:
return []
queue = []
queue.insert(0,root)
cur_line = []
while len(queue):
pop = queue.pop()
cur_line.append(pop.val)
if pop.left is not None:
queue.insert(0,pop.left)
now = queue[0]
if pop.right is not None:
queue.insert(0,pop.right)
now = queue[0]
if pop == last:
last = now
return cur_line
题目二:
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class TreePrinter:
def printTree(self, root):
last = root
now = root
if root is None:
return []
queue = []
queue.insert(0,root)
cur_line = []
res = []
while queue:
pop = queue.pop()
cur_line.append(pop.val)
if pop.left is not None:
queue.insert(0,pop.left)
now = queue[0]
if pop.right is not None:
queue.insert(0,pop.right)
now = queue[0]
if pop == last:
last = now
res.append(cur_line[:])
cur_line = []
return res