题目是这个样子滴:
思路是这个样子滴:
首先,看打印结果的要求,是要有一个外层顺序表,而每个顺序表的元素都是一个顺序表。
而且,我们需要在层序遍历时要记录当前节点所在的层数,由于队列中只能放一个对象,所以我们把节点和层数封装成一个类,让层数变成一个属性。
代码是这个样子滴:
public class TreeNode {
public int val;
public TreeNode left = null ;
public TreeNode right = null;
public TreeNode (int value){
this.val = value;
}
}
public class levelOrder {
private static class Element{
int level;
TreeNode node;
}
public static List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> retList = new ArrayList<>();
if(root == null){
return retList; //为空,返回空
}
Queue<Element> queue = new LinkedList<>(); //建立链表实现的队列
Element e = new Element();
e.node = root;
e.level = 0;
queue.add(e);//加入第一个根节点
//开始循环
while (!queue.isEmpty()) {
Element front = queue.poll();
//读队首元素并删除
if(front.level == retList.size()){ //如果在外层链表中还没有内层顺序表
retList.add(new ArrayList<>()); //创建顺序表
}
retList.get(front.level).add(front.node.val); //添加节点进入
//层序遍历
if (front.node.left != null) {
Element l = new Element();
l.node = front.node.left;
l.level = front.level + 1;
queue.add(l);
}
if (front.node.right != null) {
Element r = new Element();
r.node = front.node.right;
r.level = front.level + 1;
queue.add(r);
}
}
return retList;
}
简单的测试一下:
public static void main(String[] args) {
TreeNode a = new TreeNode(3);
TreeNode b = new TreeNode(9);
TreeNode c = new TreeNode(20);
TreeNode d = new TreeNode(15);
TreeNode e = new TreeNode(7);
a.left = b;
a.right = c;
c.left = d;
c.right = e;
System.out.println(levelOrder(a));
}
运行结果:
成功!