zoukankan      html  css  js  c++  java
  • 二叉树--层序遍历(leetcode 102

    BFS和DFS

    二叉树的先序遍历是DFS
    DFS遍历使用递归(隐式使用栈):

    void dfs(TreeNode root) {
        if (root == null) {
            return;
        }
        dfs(root.left);
        dfs(root.right);
    }
    

    BFS遍历使用队列

    void bfs(TreeNode root) {
        Queue<TreeNode> queue = new ArrayDeque<>();
        queue.add(root);
        while (!queue.isEmpty()) {
            TreeNode node = queue.poll(); 
            if (node.left != null) {
                queue.add(node.left);
            }
            if (node.right != null) {
                queue.add(node.right);
            }
        }
    }
    

    BFS常用于解决两类问题

    • 层序遍历
    • 最短路径

    本题题解

    层序遍历的结果与BFS遍历的结果不是完全一样的,层序遍历需要按层区分开

    所以需要修改代码,在每一层开始遍历前,先记录此时队列中节点的数量,然后一口气处理这n个节点,这样就可以把不同层分开。

    public class Solution102 {
        public List<List<Integer>> levelOrder(TreeNode root) {
            List<List<Integer>> result = new LinkedList<>();
            if (root == null){
                return result;
            }
            Queue<TreeNode> queue = new ArrayDeque<>();
            queue.offer(root);
            while (!queue.isEmpty()) {
    
                int n = queue.size();
                List<Integer> list = new LinkedList<> ();
                for (int i = 0; i < n; i++){
                    TreeNode temp = queue.poll();
                    list.add(temp.val);
                    if (temp.left != null){
                        queue.offer(temp.left);
                    }
                    if (temp.right != null) {
                        queue.offer(temp.right);
                    }
                }
                result.add(list);
            }
            return result;
        }
    }
    

    BFS模板

    1.直接BFS

    void bfs(TreeNode root) {
        Queue<TreeNode> queue = new ArrayDeque<>();
        queue.add(root);
        while (!queue.isEmpty()) {
            TreeNode node = queue.poll(); 
            if (node.left != null) {
                queue.add(node.left);
            }
            if (node.right != null) {
                queue.add(node.right);
            }
        }
    }
    

    2.按层将结果分开

    // 二叉树的层序遍历
    void bfs(TreeNode root) {
        Queue<TreeNode> queue = new ArrayDeque<>();
        queue.add(root);
        while (!queue.isEmpty()) {
            int n = queue.size();
            for (int i = 0; i < n; i++) { 
                // 变量 i 无实际意义,只是为了循环 n 次
                TreeNode node = queue.poll();
                if (node.left != null) {
                    queue.add(node.left);
                }
                if (node.right != null) {
                    queue.add(node.right);
                }
            }
        }
    }
    

    扩充:BFS最短路径问题

    待补充,参考自

    https://mp.weixin.qq.com/s?__biz=MzA5ODk3ODA4OQ==&mid=2648167212&idx=1&sn=6af5ffe5b69075b21bb4743ddcee4e7c&chksm=88aa236abfddaa7cae70b42edb299d0a52d9f1cc4fc1fdba1116972fc0ca0275b8bfdf10851b&token=1607921395&lang=zh_CN#rd

  • 相关阅读:
    STL容器 erase的使用陷井
    转:VC++线程同步-事件对象
    VC线程同步方法
    C/C++四种退出线程的方法
    rabbitMQ 常用命令
    Spring @Configuration
    Spring RabbitMQ 延迟队列
    rabbitmq web管理界面 用户管理
    Linux下tar.gz 安装
    Linux下RPM软件包的安装及卸载
  • 原文地址:https://www.cnblogs.com/swifthao/p/13290003.html
Copyright © 2011-2022 走看看