美文网首页
二叉树--按层遍历

二叉树--按层遍历

作者: 今年花开正美 | 来源:发表于2020-06-03 23:29 被阅读0次

今天练习的算法是按层遍历一个二叉树。

题目介绍

我们还是用这张老的二叉树来举例子吧:


二叉树遍历题目.png

按层遍历的意思是从树的跟节点开始,一层层遍历并输出节点的值。输出的结果使用二维的数组存放,我们使用List<List<Integer>>来表示。上图的结果为:
[
[F],
[B,G],
[A,D,I],
[C,E,H]
]

实现思路

老规矩先看图:


二叉树-按层遍历解题思路.png

实现最主要的技巧就是使用队列(Queue),我还是使用递归的思想来分析吧,每次进入递归前带有四个参数orderList、queue、level、preSize。
先稍微分析下四个参数作用吧:

  • orderList:结果列表,结构就是和上述结果的结构一致。
  • queue:存放节点的队列,满足FIFO原则。
  • level:当前递归的层次,主要用来定位存放到orderList的下标。
  • preSize:上一层的节点长度,用来确定当此递归需要从queue中取出的元素个数。

基本实现逻辑如下:
1.先从根节点开始,初始化orderList、queue、level、preSize,其中orderList为空,queue中存放root节点,level为0,preSize为1。
2.进入递归方法,首先循环从queue队列中取出preSize数量的节点;然后挨个遍历取出的节点,将节点的值添加到orderList对应的层(level)中;同时将节点的左右子节点均添加到queue队列中,并且记录存放到queue中的节点数量以备下次递归使用;最后根据记录的下一层节点数量判断是否需要继续递归。

核心是要边遍历某一层的时候同时将该层节点的所有节点添加到queue中,并且记录下一层总的节点数,这样才能保证下一层遍历时不会从队列中取到非该层的节点。

实现代码

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

    TreeNode() {
    }

    TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}
public class SolutionLevelTraversal {

        public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> orderList = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();
        if (null != root) {
            int level = 0;
            int size = 1;
            queue.add(root);
            return levelOrder(orderList, queue, level, size);
        }
        return orderList;
    }

    public List<List<Integer>> levelOrder(List<List<Integer>> orderList, Queue<TreeNode> queue, int level, int preSize) {
        List<Integer> leverList = new ArrayList<>();
        int size = 0;
        while (preSize > 0) {
            TreeNode node = queue.remove();
            leverList.add(node.val);
            if (null != node.left) {
                queue.add(node.left);
                size++;
            }
            if (null != node.right) {
                queue.add(node.right);
                size++;
            }
            preSize--;
        }

        orderList.add(leverList);

        if (size > 0) {
            return levelOrder(orderList, queue, ++level, size);
        }
        return orderList;
    }
}

算法相关实现源码地址:https://github.com/xiekq/rubs-algorithms

相关文章

  • ALI 算法

    二叉树遍历算法: 按层遍历, 中序前序后序:

  • leecode刷题(25)-- 二叉树的层序遍历

    leecode刷题(25)-- 二叉树的层序遍历 二叉树的层序遍历 给定一个二叉树,返回其按层次遍历的节点值。 (...

  • 3.有关二叉树的算法

    1.分层遍历二叉树:宽度优先遍历 2.分层遍历应用,按层打印二叉树 3.前序遍历二叉树 4.前序遍历,迭代 5.中...

  • Leetcode 102 二叉树的层序遍历

    二叉树的层序遍历 题目 给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)...

  • 102.二叉树的层序遍历

    二叉树的层序遍历 题目 给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)...

  • LeetCode 102. 二叉树的层序遍历 Binary Tr

    102. 二叉树的层序遍历 给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节...

  • 二叉树--按层遍历

    今天练习的算法是按层遍历一个二叉树。 题目介绍 我们还是用这张老的二叉树来举例子吧: 按层遍历的意思是从树的跟节点...

  • 二叉树遍历

    二叉树的遍历大概分为四种: 前序遍历,中序遍历,后序遍历,按层遍历。 1.前序遍历: 原则:根->左->右 2.中...

  • 力扣 297 二叉树的序列化与反序列化

    题意:序列化和反序列化一个二叉树 思路:按层遍历 思想:树的按层遍历 复杂度:时间O(n),空间O(n)

  • 二叉树遍历

    二叉树的遍历,分为深度优先遍历和广度优先遍历,其中深度优先遍历又分为有前序、中序、后序遍历,广度优先遍历就是按层遍...

网友评论

      本文标题:二叉树--按层遍历

      本文链接:https://www.haomeiwen.com/subject/uczizhtx.html