有一棵二叉樹,請設計一個算法,按照層次打印這棵二叉樹。
給定二叉樹的根結點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;
}
}