107. Binary Tree Level Order Traversal II
Easy
56398FavoriteShare
Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root).
For example:
Given binary tree [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
return its bottom-up level order traversal as:
[
[15,7],
[9,20],
[3]
]
参考了一份代码,结果没怎么看懂。。。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> list = new LinkedList<List<Integer>>();//LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。
if(root==null)
return list;
List<Integer> intList = new LinkedList<Integer>();
Queue<TreeNode> queue = new LinkedList<TreeNode>();
TreeNode t = null;
queue.offer(root);
int curCount=0,curNum=1,nextCount=1;
while(!queue.isEmpty()){
t=queue.poll();//poll是队列数据结构实现类的方法,从队首获取元素,同时获取的这个元素将从原队列删除;pop是栈结构的实现类的方法,表示返回栈顶的元素,同时该元素从栈中删除,当栈中没有元素时,调用该方法会发生异常
intList.add(t.val);//add用在链表中,offer用在队列中,前者是实现了list接口的方法,后者是实现了queue接口的方法
if(t.left!=null){
queue.offer(t.left);
nextCount++;
}if(t.right!=null){
queue.offer(t.right);
nextCount++;
}
curCount++;
if(curCount==curNum){
list.add(0,intList);
intList=new LinkedList<Integer>();
curNum=nextCount;
}
}return list;
}
}
关于arraylist:https://www.cnblogs.com/skywang12345/p/3308556.html
关于linkedlist:https://www.cnblogs.com/skywang12345/p/3308807.html
然后参考了一个提交之后看到的代码,这个看懂了而且比较精简,所以以这个为java最终版:
public class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> res = new LinkedList<List<Integer>>();
levelMaker(res, root, 0);//迭代
return res;
}
public void levelMaker(List<List<Integer>> list, TreeNode root, int level) {
if(root == null) return;//返回值为void直接return即可,这里是递归体的终止条件
if(level >= list.size()) {//这里size记录的如果是9,那level的编号就是8,所以等于的情况下也是超出层数需要再加一个链表
list.add(0, new LinkedList<Integer>());
}//level在list中
levelMaker(list, root.left, level+1);
levelMaker(list, root.right, level+1);//当两边都递归遍历到叶子节点的时候才会停止并执行下一步
list.get(list.size()-level-1).add(root.val);//因为要求的显示是倒序的,所以从list.size()-最大层level-1开始,比如一共有10层,那叶子节点的level=9,这一层应该存在第10-9-1=0个数组里面
}
}
用了迭代和子函数的递归,记录层数,记录数值,然后把数值放进应该存在的层里。(一个列表里面有多个子列表,相当于二维数组)
因为递归体先左后右所以不会乱序,会每一层依次遍历放进列表。
注意每一层的放入顺序应该是倒序的。