二叉树及深度/广度遍历 笔记

news/2024/7/19 13:09:56 标签: 二叉树, js, 前端

这里写目录标题

  • 树是什么?
  • 什么是深度/广度优先遍历?
  • 二叉树的先中后序遍历

https://gitee.com/thinkerwing/study/tree/master/%E9%9D%A2%E8%AF%95%E9%A2%98/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/%E6%A0%91

树是什么?

  • 树是一种分层数据的抽象模型
  • 前端工作中常见的树包括:DOM树、级联选择、树形控件
  • JS中没有树,但是可以用Object和Array构建树。
  • 树的常用操作:深度/广度优先遍历、先中后序遍历。

什么是深度/广度优先遍历?

在这里插入图片描述
深度优先就像翻书,先看第一章,再看第一章的小结,看完看第二章。
广度优先就像看目录,看一下有哪儿几章,再看里面的内容

深度优先遍历算法口诀
访问根节点。
对根节点的children诶个进行深度优先遍历。

const tree = {
    val: 'a',
    children:[
        {
            val:'b',
            children:[
                {
                    val:'d',
                    children:[]
                },
                {
                    val:'e',
                    children:[]
                }
            ]
        },
        {
            val:'c',
            children:[
                {
                    val:'f',
                    children:[]
                },
                {
                    val:'g',
                    children:[]
                }
            ]
        }
    ]
}
const dfs = (root) => {
    console.log(root.val);
    root.children.forEach(dfs)
}
dfs(tree)

广度优先遍历算法口诀

  • 新建一个队列,把根节点入队
  • 把队头出队并访问
  • 把队头的children诶个入队
  • 重复第二、三步,直到队列为空
const bfs = (root) => {
    const q = [root]
    while(q.length>0) {
        const n = q.shift()
        console.log(n.val);
        n.children.forEach(child => {
            q.push(child)
        })
    }
}
bfs(tree)

二叉树的先中后序遍历

二叉树是什么?

  • 树中每个节点最多只能有两个子节点
  • 在JS中通常用Object来模拟二叉树

在这里插入图片描述

const bt = require('./bt');
const preorder = (root) => {
    if (!root) { return; }
    console.log(root.val);
    preorder(root.left);
    preorder(root.right);
}
preorder(bt);

在这里插入图片描述

const bt = require('./bt');
const inorder = (root) => {
    if(!root) {return;}
    inorder(root.left);
    console.log(root.val);
    inorder(root.right);
} 
inorder(bt);

在这里插入图片描述

const bt = require('./bt');
const postorder = (root) => {
    if (!root) { return; }
    postorder(root.left);
    postorder(root.right);
    console.log(root.val);
};
postorder(bt);

http://www.niftyadmin.cn/n/883293.html

相关文章

Qt cmake 根据不同参数编译不同程序

Qt cmake 根据不同参数编译不同程序。   比如我这里的例子,编译的主机是否编译libtorch、是否编译拥有gpu,分三种情况执行三种函数。就是判断一下Calculation_Method的值,对应引入不同的cpp。ventricularremodeling.h里所有函数分开两个cpp…

链表笔记

链表笔记链表是什么数组 vs 链表JS中的链表原型链链表是什么 多个元素组成的列表元素存储不连续,用next指针连在一起 数组 vs 链表 数组:增删非首尾元素时往往需要移动元素。 链表:增删非首尾元素,不需要移动元素,…

qt 汉字转拼音、简拼

汉字转拼音控件作者 作者:feiyangqingyun(QQ:517216493) 下载地址: https://pan.baidu.com/s/1SW_81M-Rzdav1EEW5ZgjEg 提取码: 6h2c class ZhToPY : public QObject #endif{Q_OBJECTpublic:static ZhToPY *Instance();explicit ZhToPY(QObject *parent nullptr);private:sta…

JS-Web-API 笔记

JS-Web-APIJS-WEB-APIDOM的本质是什么BOM相关的面试题事件ajax存储一个完整的 JavaScript 实现是由以下 3 个不同部分组成的:核心(ECMAScript) 文档对象模型(DOM) 浏览器对象模型(BOM) JS-WEB-…

qt 图表增加任意点

qt 画2d图表无非就是QCustomPlot Qwt QCharts。无论是性能、易用、美观都是QCustomPlot最好。 QCustomPlot下载 https://www.qcustomplot.com/index.php/download QCustomPlot帮助文档,你下载后文件夹里.qch结尾的就是帮助文档,添加到qt creator 里可以…

【笔记】Vue源码解析之虚拟DOM和diff算法

diff算法和虚拟DOM笔记简介diff算法和虚拟DOM简介snabbdom简介和测试环境搭建虚拟 DOM 和 h 函数手写h函数感受diff算法手写上树尝试书写diff更新子节点笔记简介 本文为尚硅谷视频学习笔记,参考博客学习速度更快,跟着视频记录笔记加深印象及补充视频中讲…

Study-VTK

Study-VTK 工作中需要用到vtk,他效率虽然比不上opengl,但是其比较注重代码结构严谨,功能完善而接口清晰,易于使用。在这里记录自己学习vtk和itk的过程。 以下内容/链接中自己写的博客主要根据 【VTK图形图像开发进阶(张…

vue中使用element进行表单验证

因项目需求用到表单验证,但是网上缺少直接能用的,通过借鉴加以改造,用引用cdn的形式,可以直接打开html文件,不用搭建vue项目,便于参考学习,后期慢慢增补用到的表单验证。 参考链接 https://blog…