leetcode107_Binary Tree Level Order Traversal II

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个数组里面
        }
}

用了迭代和子函数的递归,记录层数,记录数值,然后把数值放进应该存在的层里。(一个列表里面有多个子列表,相当于二维数组)

因为递归体先左后右所以不会乱序,会每一层依次遍历放进列表。

注意每一层的放入顺序应该是倒序的。

猜你喜欢

转载自blog.csdn.net/lilililililydia/article/details/85314120
今日推荐