(二叉树)原来二叉树的层序遍历这么简单!!!

Posted 南淮北安

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(二叉树)原来二叉树的层序遍历这么简单!!!相关的知识,希望对你有一定的参考价值。

一、层序遍历

层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树

需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑

这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上
在这里插入图片描述

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> lists = new ArrayList<>();
        List<Integer> list;
        //队列,遍历节点使用
        Deque<TreeNode> deque = new LinkedList<>();
        deque.add(root);
        TreeNode node;
        //记录每一层的节点
        int size;
        while (!deque.isEmpty()) {
            size = deque.size();
            list = new ArrayList<>();
            //保证每次出一层节点
            while (size > 0) {
                node = deque.poll();
                list.add(node.val);
                if (node.left != null) {
                    deque.add(node.left);
                }
                if (node.right != null) {
                    deque.add(node.right);
                }
                size--;
            }
            lists.add(list);
        }
        return lists;
    }
}

二、层序遍历II

在这里插入图片描述
与正常的层序遍历相比,只需要翻转下 lists 即可

Collections.reverse(lists);
import java.util.*;

class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> lists = new ArrayList<>();
        if (root == null) {
            return lists;
        }
        List<Integer> list;
        //队列,遍历节点使用
        Deque<TreeNode> deque = new LinkedList<>();
        deque.add(root);
        TreeNode node;
        //记录每一层的节点
        int size;
        while (!deque.isEmpty()) {
            size = deque.size();
            list = new ArrayList<>();
            //保证每次出一层节点
            while (size > 0) {
                node = deque.poll();
                list.add(node.val);
                if (node.left != null) {
                    deque.add(node.left);
                }
                if (node.right != null) {
                    deque.add(node.right);
                }
                size--;
            }
            lists.add(list);
        }
        //翻转集合
        Collections.reverse(lists);
        return lists;
    }
}

三、二叉树的右视图

给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值
在这里插入图片描述
题目要求,记录最右侧的节点,所以只需要层序遍历,输出单层遍历的最后一个节点即可

class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        if (root == null) {
            return new ArrayList();
        }
        List<Integer> list = new ArrayList<>();
        Deque<TreeNode> deque = new LinkedList<>();
        TreeNode node;
        deque.add(root);
        while (!deque.isEmpty()) {
            int size = deque.size();
            while (size > 0) {
                node = deque.poll();
                //记录每层最后一个节点
                if (size == 1) {
                    list.add(node.val);
                }
                if (node.left != null) {
                    deque.add(node.left);
                }
                if (node.right != null) {
                    deque.add(node.right);
                }
                size--;
            }
        }
        return list;
    }
}

四、 二叉树的层平均值

在这里插入图片描述
同样层序遍历,然后记录每一行的平均值即可

class Solution {
    public List<Double> averageOfLevels(TreeNode root) {
        if (root == null) {
            return new ArrayList();
        }
        List<Double> list = new ArrayList<>();
        Deque<TreeNode> deque = new LinkedList<>();
        TreeNode node;
        int size;
        double sum;
        int len;
        deque.add(root);
        while (!deque.isEmpty()) {
            size = deque.size();
            len = size;
            sum = 0;
            while (size > 0) {
                node = deque.poll();
                //sum 记录每层的总和
                sum += node.val;
                if (node.left != null) {
                    deque.add(node.left);
                }
                if (node.right != null) {
                    deque.add(node.right);
                }
                size--;
            }
            list.add(sum / len);
        }
        return list;
    }
}

五、N 叉树的层序遍历

给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。

树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。

在这里插入图片描述
题目和二叉树的方法类似,只是将原先的判断左右子树,改为判断是否有孩子节点

class Solution {
    public List<List<Integer>> levelOrder(Node root) {
        if (root == null) {
            return new ArrayList();
        }
        List<List<Integer>> lists = new ArrayList<>();
        List<Integer> list;
        Deque<Node> deque = new LinkedList<>();
        deque.add(root);
        Node node;
        int size;
        while (!deque.isEmpty()) {
            list = new ArrayList<>();
            size = deque.size();
            while (size > 0) {
                node = deque.poll();
                list.add(node.val);
                //由原来的判断走右子树,改为判断是否有孩子节点
                for (Node temp : node.children) {
                    deque.add(temp);
                }
                size--;
            }
            lists.add(list);
        }
        return lists;
    }
}

六、总结

所谓的层序遍历就是图论中的广度优先搜索,需要借助队列实现

Deque<Node> deque = new LinkedList<>();

每层的节点需要借助size来记录

		while (!deque.isEmpty()) {
            size = deque.size();
            list = new ArrayList<>();
            //保证每次出一层节点
            while (size > 0) {
                node = deque.poll();
                list.add(node.val);
                if (node.left != null) {
                    deque.add(node.left);
                }
                if (node.right != null) {
                    deque.add(node.right);
                }
                size--;
            }
            lists.add(list);
        }

以上是关于(二叉树)原来二叉树的层序遍历这么简单!!!的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode二叉树的层序遍历

LeetCode二叉树的层序遍历

NC 15 二叉树的层序遍历

求二叉树的层序遍历

二叉树的层序遍历

NC15 求二叉树的层序遍历