题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
示例1
输入
{8,6,10,5,7,9,11}
返回值
[[8],[6,10],[5,7,9,11]]
代码实现
import java.util.ArrayList;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.*;
public class Solution {
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
if(null == pRoot){
return list;
}
List<TreeNode> nodeList = new ArrayList<TreeNode>();
if(null != pRoot.left){
nodeList.add(pRoot.left);
}
if(null != pRoot.right){
nodeList.add(pRoot.right);
}
ArrayList<Integer> rootList = new ArrayList<Integer> ();
rootList.add(pRoot.val);
list.add(rootList);
if(null != nodeList && nodeList.size()>0){ //考虑子节点存在需要处理
printLevel(list,nodeList);
}
return list;
}
//输入指定节点下的子节点
public void printLevel(ArrayList<ArrayList<Integer>> levelList,List<TreeNode> nodeList){
ArrayList<Integer> valList = new ArrayList<Integer> ();
List<TreeNode> childNodeList = new ArrayList<TreeNode>();
for(int i=0;i<nodeList.size();i++){
valList.add(nodeList.get(i).val);
if( null != nodeList.get(i).left ){
childNodeList.add(nodeList.get(i).left);
}
if(null != nodeList.get(i).right){
childNodeList.add(nodeList.get(i).right);
}
}
levelList.add(valList);
if(null !=childNodeList && childNodeList.size()>0){ //如果下级还有子节点,按照当前处理方式,把后一级同层次节点都处理
printLevel(levelList,childNodeList);
}
}
}
解题思路
这道题需要注意的一点是 “每一层输出一行” ,即同层次的节点要放在一起。上述代码 printLevel 方法即是处理树的同一层次的全部节点,因为处理逻辑一样,只是处理的节点不一致,所以直接回调printLevel方法即可,直到处理完全部节点,没有子节点了。