算法题:二叉树打印
Posted 范二er
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法题:二叉树打印相关的知识,希望对你有一定的参考价值。
1.题目
有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。
给定二叉树的根结点root,请返回打印结果,结果按照每一层一个数组进行储存,所有数组的顺序按照层数从上往下,且每一层的数组内元素按照从左往右排列。保证结点数小于等于500。
/*
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)
//write code here
2.思路
借用一个队列,以层次遍历的思想,来解答。关键点在于,判断什么时候该换层了。
- 用
last
指向当前正在打印的行的最右边的节点。 - 用
nLast
指向当前入队的节点。 - 从根结点开始,将其左右孩子以层次遍历的方式入队。每入队一个元素,即让
nLast
指向这个元素,将队首元素temp
出队到一个ArrayList
中,当temp==last
时,代表该换行了,也就是将当前ArrayList
放到一个ArrayLists
中,再讲当前的ArrayList
清空。然后last=nLast;
3.代码
public int[][] printTree(TreeNode root)
if(root==null)
return null;
int[][]result=null;
TreeNode last=root;
TreeNode nLast=null;
TreeNode temp=null;
ArrayList<Integer>array=new ArrayList<>();
ArrayList<ArrayList<Integer>> arrays=new ArrayList<>();
LinkedList<TreeNode>queue=new LinkedList<>();
queue.add(last);
while(!queue.isEmpty())
temp=queue.poll();
array.add(temp.val);
if(temp.left!=null)
queue.add(temp.left);
nLast=temp.left;
if(temp.right!=null)
queue.add(temp.right);
nLast=temp.right;
if(temp==last)
arrays.add(array);
array=new ArrayList<>();
last=nLast;
result=new int[arrays.size()][];
for(int i=0;i<arrays.size();i++)
result[i]=new int[arrays.get(i).size()];
for(int j=0;j<arrays.get(i).size();j++)
result[i][j]=arrays.get(i).get(j);
return result;
需要注意ArrayList<ArrayList<Integer>>
转换成int[][]
的方法。
以上是关于算法题:二叉树打印的主要内容,如果未能解决你的问题,请参考以下文章
乱序版 ● 剑指offer每日算法题打卡题解—— 从上到下打印二叉树(题号32)