每日一题——树的层次遍历

层次遍历简介

广度优先又叫层次遍历,基本过程如下:

层次遍历就是从根节点开始,先访问根节点下面一层全部元素,在访问之后的层次,类似金字塔一样一层一层访问。我们可以看到这里就是从左到右一层一层的遍历二叉树,先访问3,之后再访问1的左右子节点9和20,之后分别访问9和20的左右子节点[8,13]和[15,17],最后得到结果[3,9,20,8,13,15,17]。

这里面对的问题主要是,如何将遍历过的节点的子节点存储起来。例如在访问9时,应当将其子节点8和13存储起来,直到遍历20的时候在进行后续处理。

此问题可以通过队列进行解决。

  1. 首先3先入队;
  2. 然后3出队,之后将3的左右子节点9和20保存到队列中;
  3. 之后9出队,将9的左右子节点8和13入队;
  4. 之后20出队,将20的左右子节点15和7入队;
  5. 当所有节点都没有子节点的时候,将8,13,15,7分别出队。

例题:LeetCode102.二叉树的层序遍历

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

示例:

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

提示:

  • 树中节点数目在范围 [0, 2000] 内
  • -1000 <= Node.val <= 1000
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        if(root == null){
            return new ArrayList<>();//根节点为空返回空数组;
        }
        List<List<Integer>> res = new ArrayList<>();
        LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
        queue.add(root);
        while(queue.size()>0){
            int n =queue.size();//记录队列中元素的个数,然后一次处理完这一层的n个节点;
            List<Integer> level = new ArrayList<Integer>();//用于临时存储每层的节点;
            for(int i =0; i<n ;i++){
                TreeNode t = queue.remove();//存储出队节点;
            if(t.left != null){
                queue.add(t.left);
            }
            if(t.right != null){
                queue.add(t.right);
            }
            level.add(t.val);//将出队节点加到level中;
            }
            res.add(level);//循环结束后,将level数组加入到res数组中;
        }
        return res;
    }
}

提交结果,通过:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值