本篇内容为牛客网,左程云算法课程课堂笔记。
(1)有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。
给定二叉树的根结点root,请返回打印结果,结果按照每一层一个数组进行储存,所有数组的顺序按照层数从上往下,且每一层的数组内元素按照从左往右排列。保证结点数小于等于500。
要点:(1)使用队列实现二叉树的层次遍历。(2)注意换行。(3)对输出的理解。
(1)队列实现二叉树的层次遍历:从根节点开始,一层一层打印这个二叉树。首先在队列中装入根节点。然后,当队列不为空的时候,弹出队首节点,并将弹出节点的左右孩子入队列(如果存在的话)。这是二叉树层次遍历的主要过程。
(2)换行:换行的实现,是通过两个标志指:last用来指向从队列中弹出的节点所在行的最右节点,一个用来跟踪下一层的节点入队列的情况。,当last等于弹出节点,说明该换行了。并将last等于nlast.
(3) 对输出的理解:输出肯定有多种方式。但是本人基础较差。因此,在这里特意给自己叮嘱一下:使用arraylist来保存输出结果,每一层都使用一个动态数组来保存,然后,整个二叉树,使用一个大的list来保存不同层的list。
public int[][] printTree(TreeNode root) {
ArrayList<ArrayList<Integer>> list=new ArrayList<>();//用来装每层的遍历值。
ArrayList<Integer> list2=new ArrayList<>();
TreeNode last=root;
TreeNode nlast=root;
Queue<TreeNode> queue=new LinkedList<>();//用一个队列进行便利。
queue.add(root);
while (!queue.isEmpty()) {
TreeNode tmp=queue.poll();
list2.add(tmp.val);
if (tmp.left!=null) {
queue.add(tmp.left);
nlast=tmp.left;
}
if (tmp.right!=null) {
queue.add(tmp.right);
nlast=tmp.right;
}
if (tmp==last) {
last=nlast;
list.add(list2);
list2=new ArrayList<>();
}
}
int res[][]=new int[list.size()][];
for (int i = 0; i < list.size(); i++) {
res[i]=new int[list.get(i).size()];
for (int j = 0; j < res[i].length; j++) {
res[i][j]=list.get(i).get(j);
}
}
return res;
}