LeetCode——107. 二叉树的层次遍历 II

题目

给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

例如:
给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回其自底向上的层次遍历为:

[
  [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; }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> reList = new ArrayList(); // 返回的队列
        List<TreeNode> nodeList = new ArrayList();  // 装节点的队列
        List<Integer>  currentLayerList = new ArrayList();  // 装值的队列
        
        // 如果root为空直接返回reList
        if (root == null  ) {
            return reList;
        }
        
        // 初始化根节点
        nodeList.add(root);
        
        // 循环到树最后一层
        while (!nodeList.isEmpty()) {
            // 每次循环前装值的队列清空
            currentLayerList = new ArrayList();
            
            // 存储下层节点
            List<TreeNode> nextNodeList = new ArrayList(); 
            
            // 当前层的元素装入当前层元素值队列
            for (TreeNode tn : nodeList) {
                currentLayerList.add(tn.val);
                
                //节点不为空才添加
                if (tn.left != null) {
                    nextNodeList.add(tn.left);
                }
                if (tn.right != null) {
                    nextNodeList.add(tn.right);
                }
                
            }
            
            // 重置当前装节点的队列
            nodeList = nextNodeList;
            
            // 将当前层元素值队列加入 返回队列
            reList.add(currentLayerList);
        }
        
        // 返回队列由从上之下变为由底至上
        List<List<Integer>> newReList = new ArrayList(); 
        int N = reList.size();
        for (int i = 0; i < N; i++) {
            newReList.add(reList.get(N-i-1));
        }
        return newReList;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41722272/article/details/82755997