有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。
给定二叉树的根结点root,请返回打印结果,结果按照每一层一个数组进行储存,所有数组的顺序按照层数从上往下,且每一层的数组内元素按照从左往右排列。保证结点数小于等于500。
解题思路:
1.新建一个队列,将头结点压入队列。2个变量,last和nlast。last表示当前行的最右节点,初始值为头节点。nlast表示下一行的最右节点,初始值为空。
2.从队列中弹出队头元素top,并将top加入list1(用来存储每层的树节点)中。当top的左孩子存在时,将top的左孩子加入队列,nlast=top的左孩子。当top的右孩子存在时,将top的右孩子加入队列,nlast=top的右孩子。当top=last时说明该换行了。
3.重复2直至队列为空。
注意的是题目要求按行来打印树,所以List<TreeNode> list1来存储每层的树节点。List<List<TreeNode>> list来存储整棵树的节点。当top=last,时将list1加入到list中,并新建list1。
Java代码:
import java.util.*;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}*/
public class TreePrinter {
public int[][] printTree(TreeNode root) {
/*
1.需要一个队列,将头结点入队列。需要2个变量,last表示当前行的最右节点,nlast表示下一行的最右节点。
last初始值为头结点,nlast初始值为null。
2.将队列的元素top移除并打印,将top的左孩子入队,nlast更新,top的右孩子入队列,nlast持续更新。当top等于
last时说明该换行了。令last=nalst.
3.重复2的操作,直到队列为空。
因为题目要求按层打印树,所以需要List<List<TreeNode>>。里边的尖括号用来存储一层的树,外边的尖括号用来存储
各层的树。
*/
if(root==null) return null;
TreeNode last=root;
TreeNode nlast=null;
Queue<TreeNode> queue=new LinkedList<TreeNode>();//队列用linkedlist,不用ArrayList。不然会出错
List<List<TreeNode>> list=new ArrayList<List<TreeNode>>();
List<TreeNode> list1=new ArrayList<TreeNode>();
queue.offer(root);
while(!queue.isEmpty())
{
TreeNode top=queue.poll();//取出队头元素
list1.add(top);
if(top.left!=null)
{
queue.offer(top.left);
nlast=top.left;
}
if(top.right!=null)
{
queue.offer(top.right);
nlast=top.right;
}
if(top==last)//说明要换行了
{
list.add(list1);
list1=new ArrayList<TreeNode>();//注意将list1加入list后,list1要更新
last=nlast;
}
}
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<list.get(i).size();j++)
{
res[i][j]=list.get(i).get(j).val;
}
}
return res;
}
}