java相关-二叉树-层序遍历2-力扣107

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

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[[15,7],[9,20],[3]]

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

package com.company;

import javax.swing.tree.TreeNode;
import java.lang.reflect.Array;
import java.util.*;

public class Main {

    public static void main(String[] args) {

        TreeNode head = new TreeNode(1);

        head.left = new TreeNode(2);

        head.right = new TreeNode(3);

        head.left.left = new TreeNode(4);

        head.left.right = new TreeNode(5);

        head.right.left = new TreeNode(6);

        head.right.right = new TreeNode(7);


        List<List<Integer>> list = levelOrderBottom(head);

       
    }

    /**
     * 层序遍历(自底向上)(广度优先)
     *
     * @param root
     * @return
     */
    public static List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> result = new ArrayList();
        Queue<TreeNode> queue = new LinkedList<>();
        LinkedList tmp = new LinkedList<>();

        if (root != null) {
            queue.offer(root);//先放第一个节点
        }
        while (!queue.isEmpty()) {//整个二叉树

            int size = queue.size();//注意要在这里取长度
            List<Integer> list = new ArrayList<>();


            while (size > 0) {//按层
                TreeNode node = queue.peek();//让节点每次往后移动

                list.add(queue.poll().val);//队列里弹出值

                if (node.left != null) {//加入左边的值
                    queue.offer(node.left);

                }
                if (node.right != null) {//加入右边的值
                    queue.offer(node.right);
                }

                size = size - 1;//数量减少1

            }
            tmp.addFirst(list);


        }


        for (int i = 0; i < tmp.size(); i++) {
            result.add((List<Integer>) tmp.get(i));
        }

        return result;
    }


    static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        public TreeNode(int val) {
            this.val = val;
        }
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值