这一道题与二叉树的层序遍历本质是一样的,只是一个是从根节点出发,一个是以根节点结尾。都是有两种办法,一种dfs、一种遍历迭代。
思路:
1.dfs主要是用一个count(int)代表递归的层数,使用一个Lists集合来储存结果,当进入一个新的递归的时候,需要判断count值是不是大于list存放的结果,如果大于它的话,那么就需要创建新的list集合到lists首部来储存这一层递归的值,因为是以根节点为结尾,所以当添加节点值时,就需要使用add(int index,int val) 使index=res.size-count,让不同的递归的层数加入到特定的list中,直到没有左子树和右子树为止。
2.使用遍历的话,也就是使用双端队列代替queue、或者直接使用queue也可以,利用queue储存每一层的节点值,首先遍历queue,然后将其中的值进行遍历,然后加入到新建的list中,然后判断这些根节点是否存在左子树和右子树,若有就加入queue队列进入到下一轮循环,因为层序遍历是以根节点结尾,叶子结点开始,所以加入到lists时,就需要加入到lists头部就行了。
两种办法代码如下:
private List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> levelOrderBottom(TreeNode root) {
DFS(root,1);
return res;
}
private void DFS(TreeNode treeNode, int count){
if (treeNode == null) return;
if (res.size() < count) res.add(0,new ArrayList<>());
res.get(res.size() - count).add(treeNode.val);
DFS(treeNode.left,count+1);
DFS(treeNode.right,count+1);
}
private Deque<TreeNode> queue = new LinkedList<>();
private List<List<Integer>> res1 = new ArrayList<>();
public List<List<Integer>> levelOrderBottom1(TreeNode root){
queue.addLast(root);
while(!queue.isEmpty()){
int length = queue.size();
List<Integer> list = new ArrayList<>();
for (int i = 0; i < length; i++) {
TreeNode treeNode = queue.removeFirst();
list.add(treeNode.val);
if (treeNode.left != null) queue.addLast(treeNode.left);
if (treeNode.right != null) queue.addLast(treeNode.right);
}
res.add(0,list);
}
return res;
}