• 二叉树的层序遍历(JS版)


    * 二叉树构造函数

    /**
     * 树节点
     * @class
     */
    function TreeNode(val, left, right) {
        this.val = (val === undefined ? 0 : val);
        this.left = (left === undefined ? null : left);
        this.right = (right === undefined ? null : right);
    }

    直接上代码(含必要注释)

    1. BFS(广度优先搜索)

     1 /**
     2  * @param {TreeNode} root
     3  * @return {number[][]}
     4  */
     5 var levelOrder = function(root) {
     6     // 处理根节点为空的特殊情况
     7     if (root === null) return [];
     8     // 初始化一个队列(根节点入队)
     9     const q = [root];
    10     // 初始化结果数组
    11     const ans = [];
    12     // 遍历节点队列
    13     while (q.length > 0) {
    14         // 记录当前队列中的节点数量
    15         let cnt = q.length;
    16         // 初始化当前层节点的容器
    17         const level = [];
    18         // 遍历当前层的节点
    19         while (cnt-- > 0) {
    20             const node = q.shift();
    21             level.push(node.val);
    22             // 左子节点先入队
    23             if (node.left !== null) q.push(node.left);
    24             // 右子节点后入队(以保持从左到右的顺序)
    25             if (node.right !== null) q.push(node.right);
    26         }
    27         // 将当前层的遍历结果推入结果数组
    28         ans.push(level);
    29     }
    30 
    31     return ans;
    32 };

    2. DFS(深度优先搜索)

    2.1. 递归版本

     1 var levelOrder = function(root) {
     2     // 结果容器(二维数组)
     3     const ans = [];
     4     // 搜索所有节点(从第一层开始,对应索引为0)
     5     dfs(root, 0, ans);
     6 
     7     return ans;
     8 };
     9 
    10 var dfs = function(node, level, cont) {
    11     // 如果节点为空,终止当前搜索
    12     if (node === null) return;
    13     // 比对当前结果容器中的层级结果容器数量与当前层(位置),
    14     // 如果未初始化当前层的结果容器,则推出一个新数组
    15     if (cont.length <= level) cont.push([]);
    16     // 向当前层的结果容器中加入目标值
    17     cont[level].push(node.val);
    18     // 递归左子树
    19     dfs(node.left, level + 1, cont);
    20     // 递归右子树
    21     dfs(node.right, level + 1, cont);
    22 };

    2.2. 迭代版本

     1 var levelOrder = function(root) {
     2     // 根节点为空直接返回
     3     if (root === null) return [];
     4     // 遍历结果
     5     const ans = [];
     6     // 节点栈(模拟系统栈,初始化时,root节点随即入栈)
     7     const stk = [root];
     8     // 层级栈(用于记录对应节点的所属层级,root所在层级记为0,也可以为1)
     9     const level_stk = [0];
    10 
    11     while (stk.length > 0) {
    12         const node = stk.pop();
    13         const level = level_stk.pop();
    14         // 如果当前层级的数据容器在ans中还不存在(初始化一个新数组并推入)
    15         if (ans.length <= level) ans.push([]);
    16         // 在当前节点所属层级的数组中记录自身值
    17         ans[level].push(node.val);
    18         // 处理当前节点的右子树
    19         if (node.right !== null) {
    20             stk.push(node.right);
    21             level_stk.push(level + 1);
    22         }
    23         // 处理当前节点的左子树
    24         if (node.left !== null) {
    25              stk.push(node.left);
    26              level_stk.push(level + 1);
    27         }
    28     }
    29 
    30     return ans;
    31 };
  • 相关阅读:
    树与堆
    Python基础
    python基础
    Flask基础知识
    其他(MySQL)
    发生错误:请确认您的电脑是否安装了excel软件,并且您的浏览器是否允许远行excel!具体操作请查阅帮助.
    idea启动项目,报java.lang.OutOfMemoryError: PermGen space 和启动项目很慢的问题解决
    安装jdk,tomcat,oracle,PL/SQL的一些问题
    linux下安装jdk8,nginx
    mybatic中xml新增一条数据获取自增id
  • 原文地址:https://www.cnblogs.com/fanqshun/p/15710942.html
Copyright © 2020-2023  润新知