• 二叉树的层序遍历(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 };
  • 相关阅读:
    sql脚本:将一个数据库完整复制到另一个数据库(转)
    问题:DropDownList启用AutoPostback后,SelectedIndexChanged事件跟踪不到
    学习:如何在已有MOSS的环境下重装IIS(转)
    学习:MOSS2007 实现单点登陆(转)
    sql脚本:恢复数据库(根据备份的bak)(转)
    学习:深入浅出之正则表达式(转)
    错误:此网页的安全性验证无效并且可能损坏。请单击 Web 浏览器中的“后退”,刷新网页,再重试操作
    学习:关于代码调用SSP获取UserProfile出错的解决方案(转)
    问题:提升权限后,更新SPListItem即 Item.Update()出错问题
    学习:char、varchar、text和nchar、nvarchar、ntext的区别(转)
  • 原文地址:https://www.cnblogs.com/fanqshun/p/15710942.html
Copyright © 2020-2023  润新知