javascript 二叉树(Trees)算法与说明

决策树原理与实战:从信息增益到可解释AI 决策树是一种基于规则的监督学习算法,通过递归分割数据以最小化不纯度(如基尼不纯度或信息增益),实现分类与回归任务。其核心在于模拟人类判断逻辑,具备天然可解释性,无需特征缩放,适合结构化表格数据建模。技术价值体现在低计算开销、毫秒级推理、内置特征重要性评估,以及作为随机森林、XGBoost等集成模型的基础构件。广泛应用于金融风控、医疗辅助诊断、政务智能分派等需合规审计与业务对齐的场景。本文深入剖析CART树构建机制、剪枝策略与sklearn工程实践,聚焦Decision Tree与基尼不纯度在真实项目中的落地 阅读详情

二叉树的介绍

树是一个非顺序数据结构,它对于存储需要快速查找的数据非常有用。

现实例子就是公司的组织架构,总裁为树的最顶端叫根节点,各部门按照领导人区分为子树。


二叉树术语概念

整个二叉树结构中,每个点叫作节点,每个节点都有父节点,而最上面的为根节点,根节点是没有父节点的。
节点另外一个属性为深度,是根据父节点有多少个来算的。
由根节点向下分的2个节点为子树,子树下面节点也是子树。

如图:
1.11为根节点
2.根节点有2个子节点7,15
3.7,15又为子树。
4.5,9,13,20又为7,15的子树。
5.最下排的节点深度为3,向上走递减。


二叉树和二叉树搜索

二叉树最多2个节点,一个是左侧子节点,一个是右侧子节点。这些定义有助于我们写出更高效的向树中插入、查找和删除节点的算法。
二叉树搜索树(BST)是二叉树的一种,但是它只允许你在左侧节点存储(比父节点)小的值,在右侧节点存储(比父节点)大(或者等于)的值。

例子—插入一个节点

如根据下图,现在已经有一个二叉树。我们需要添加一个6,是怎样的?



首先会检测二叉树是否为空?
第二检测根节点(key[6] < root[11]为真),然后继续检测(node.left不是null),到达node.left[7]节点。
第三检测(key[6] < key[7]为真),然后继续检测(node.left不是null),到达node.left[5]节点。
最后检测(key[6] < key[5]为真),然后继续检测(node.right不是null),为空添加在key[5]右节点添加key[6]。

例子—移除一个节点

现在我们要移除一个节点5。

首先会检测二叉树是否为空?
第二检测根节点(key[5] = root[11]为真),然后检查(key[5] < root[11])然后继续检测(node.left不是null),到达node.left[7]节点。
第三检测根节点(key[5] = key[7]为真),然后检查(key[5] < key[7]为真),然后继续检测(node.left不是null),到达node.left[5]节点。
第四检测(key[5] = key[5]为真),然后删除 key[5]节点。
最后(key[5] )子节点,key[3]的父节点改成原来key[5]的父节点key[7]。


二叉树的遍历

二叉树的遍历有三种方式:中序遍历、先序遍历和后序遍历。

中序遍历

中序遍历是一种以上行顺序访问BST所有节点的遍历方式,也就是以从最小到最大的顺序访问所有节点。可以应用于树的排序操作。
如图:

访问顺序:3,5,6,7,8,9,10,11,12,13,14,15,18,20,25


先序遍历

先序遍历是试以优先于后代节点的顺序访问每个节点的。可以应用于打印树的结构文档。
如图:

访问顺序:11,7,5,3,6,9,8,10,15,13,12,14,20,18,25


后序遍历

后序遍历是先访问节点的后代节点,再访问节点本身。后序遍历可以应用于计算一个目录和它的子目录中所有文件所占空间的大小。
如图:

访问顺序:3,6,5,8,10,9,7,12,14,13,18,25,20,15,11


二叉树(BinarySearchTree)类应用

var tree = new BinarySearchTree();

tree.insert(11);
tree.insert(7);
tree.insert(15);
tree.insert(5);
tree.insert(3);
tree.insert(9);
tree.insert(8);
tree.insert(10);
tree.insert(13);
tree.insert(12);
tree.insert(14);
tree.insert(20);
tree.insert(18);
tree.insert(25);
tree.insert(6);//11,7,15,5,3,9,8,10,13,12,14,20,18,25,6

function printNode(value){
    console.log(value);
}
tree.inOrderTraverse(printNode);//中序遍历3,5,6,7,8,9,10,11,12,13,14,15,18,20,25

tree.preOrderTraverse(printNode);//先序遍历11,7,5,3,6,9,8,10,15,13,12,14,20,18,25

tree.postOrderTraverse(printNode);//后序遍历3,6,5,8,10,9,7,12,14,13,18,25,20,15,11

tree.max();//25
tree.min();//3
tree.remove(6);//删除6节点
tree.inOrderTraverse(printNode);
//中序遍历3,5,7,8,9,10,11,12,13,14,15,18,20,25
tree.getRoot()//11

ES6二叉树表完整实现代码:

let BinarySearchTree = (function() {
    class Node {
        constructor(key) {
            this.key = key;
            this.left = null;
            this.right = null;
        }
    }

    class BinarySearchTree {
        constructor() {
            this.root = null;
        }

        insert(key) {//向二叉树插入一个新的键
            var newNode = new Node(key);

            if(this.root === null) {
                this.root = newNode;
            } else {
                this.insertNode(this.root, newNode);
            }
        }

        insertNode(node, newNode) {
            if(newNode.key < node.key) {
                if(node.left === null) {
                    node.left = newNode;
                } else {
                    this.insertNode(node.left, newNode);
                }
            } else {
                if(node.right === null) {
                    node.right = newNode;
                } else {
                    this.insertNode(node.right, newNode);
                }
            }
        }

        getRoot() {//获取根节点
            return this.root;
        }

        search(key) {//在二叉树查找一个键,如果节点存在,则返回true;如果不存在,则返回false。
            return this.searchNode(this.root, key);
        }

        searchNode(node, key) {
            if(node === null) {
                return false;
            }

            if(key < node.key) {
                return this.searchNode(node.left, key);

            } else if(key > node.key) {
                return this.searchNode(node.right, key);

            } else {
                return true;
            }
        }

        inOrderTraverse(callback) {//通过中序遍历方式遍历所有节点
            this.inOrderTraverseNode(this.root, callback);
        }

        inOrderTraverseNode(node, callback) {
            if(node !== null) {
                this.inOrderTraverseNode(node.left, callback);
                callback(node.key);
                this.inOrderTraverseNode(node.right, callback);
            }
        }

        preOrderTraverse(callback) {//通过先序遍历方式遍历所有节点。
            this.preOrderTraverseNode(this.root, callback);
        }

        preOrderTraverseNode(node, callback) {
            if(node !== null) {
                callback(node.key);
                this.preOrderTraverseNode(node.left, callback);
                this.preOrderTraverseNode(node.right, callback);
            }
        }

        postOrderTraverse(callback) {//通过后序遍历方式遍历所有节点。
            this.postOrderTraverseNode(this.root, callback);
        }

        postOrderTraverseNode(node, callback) {
            if(node !== null) {
                this.postOrderTraverseNode(node.left, callback);
                this.postOrderTraverseNode(node.right, callback);
                callback(node.key);
            }
        }

        min() {//返回二叉树中最小的键值
            return this.minNode(this.root);
        }

        minNode(node) {
            if(node) {
                while(node && node.left !== null) {
                    node = node.left;
                }

                return node.key;
            }
            return null;
        }

        max() {//返回二叉树中最大的键值
            return this.maxNode(this.root);
        }

        maxNode(node) {
            if(node) {
                while(node && node.right !== null) {
                    node = node.right;
                }

                return node.key;
            }
            return null;
        }

        remove(element) {//从书中移除某个键
            this.root = this.removeNode(this.root, element);
        }

        findMinNode(node) {
            while(node && node.left !== null) {
                node = node.left;
            }

            return node;
        }

        removeNode(node, element) {

            if(node === null) {
                return null;
            }

            if(element < node.key) {
                node.left = this.removeNode(node.left, element);
                return node;

            } else if(element > node.key) {
                node.right = this.removeNode(node.right, element);
                return node;

            } else { 

                if(node.left === null && node.right === null) {
                    node = null;
                    return node;
                }


                if(node.left === null) {
                    node = node.right;
                    return node;

                } else if(node.right === null) {
                    node = node.left;
                    return node;
                }


                var aux = this.findMinNode(node.right);
                node.key = aux.key;
                node.right = this.removeNode(node.right, aux.key);
                return node;
            }
        };

    }
    return BinarySearchTree;
})()

相关文章

javascript AVL树算法与说明:http://blog.youkuaiyun.com/rth362147773/article/details/78014586
javascript 红黑树算法与说明:http://blog.youkuaiyun.com/rth362147773/article/details/78014688

递归调用树可视化:从日志记录到Graphviz渲染 递归调用树是理解算法执行路径、时间复杂度与内存消耗的核心抽象。其本质是函数调用栈在时间维度上的结构化展开,遵循先序遍历的生长逻辑,每一层对应一次函数进入(call)与返回(return)的成对事件。通过精准捕获深度、参数、耗时、父子关系等元数据,可构建高保真递归日志,进而驱动可视化分析——这不仅支撑教学中对斐波那契重复子问题、归并排序分治过程的直观阐释,更服务于性能调优时识别深度过载与热点分支。本文聚焦于轻量Recorder与声明式Graphviz Renderer的解耦架构,实现可回放、可导出、可量化的递 阅读详情

相关推荐

dtreeviz决策树可视化:让模型可解释性真正落地

决策树作为最基础的可解释机器学习模型,其核心价值不仅在于预测能力,更在于能清晰呈现‘为什么这样判断’的逻辑链。理解其分裂机制、样本流向与特征重要性,是风控、医疗、营销等高敏感场景中模型审计、业务对齐与监管合规的前提。dtreeviz通过重构视觉语法与交互叙事,将抽象树结构转化为带数据分布、路径追踪和动态直方图的具象认知界面,显著降低人类对模型逻辑的理解门槛。相比scikit-learn原生plot_tree的调试导向,dtreeviz聚焦真实交付场景——支持SVG导出、D3.js嵌入、多模型对比及中文友好渲

chenzhuofei4155的博客 461

二叉树(js实现)

二叉树基本概念基本术语二叉树类型性质遍历代码实现(js)前序遍历中序遍历后序遍历层序遍历二叉搜索树镜像二叉树重建二叉树其他常见算法题求二叉树深度二叉树结点总数判断二叉树子结构将二叉搜索树转换成一个排序的双向链表 基本概念 二叉树是n个有限元素的集合,该集合或者为空、或由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成 基本术语 结点之间的关系 若一个结点有子树,那么该结点称为子树根的双亲,子树的根称为该结点的孩子 有相同双亲的结点互为兄弟 一个结点的所有子树上的任何

6235

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 07 堆、栈、表、矩阵、集合、队列、数组、字符串、树、图、动态规划、结构体、元组的算法01

当前段必须包含所有字符的最后出现位置。1. 字符串分割成最多片段2. 基因序列功能域划分3. 文本段落划分4. 音频声道分离5. 图像色彩分区6. 社交网络社群划分7. 蛋白质结构域8. 音乐乐章分段9. 代码模块划分10. 章节划分特征:一次扫描,贪心确定边界。

weixin_49199313的博客 1267

使用js实现二叉树

树是计算机科学中经常用到的一种数据结构。树是一种非线性的数据结构,以分层的方式存储数据。树被用来存储具有层级关系的数据,比如文件系统中的文件;树还被用来存储有序列表。从本篇开始,将会实现一种特殊的树——二叉树。 二叉树具有诸多优点。相对于链表来说,二叉树在进行查找时速度非常快,而相对于数组来说,为二叉树添加或删除元素也非常快。...

w1787184616的博客 2496

JavaScript TREEJS插件:轻松处理树结构数据

本文还有配套的精品资源,点击获取 简介:JavaScript是用于构建交互式网页应用的主要前端语言。本文重点介绍了一个名为"TREEJS"的JavaScript插件,它专为树形结构数据处理而设计。本文将深入探讨 TREEJS 插件的核心功能,包括树的创建、节点的增删改查等操作方法。这些功能对前端应用,如数据可视化、文件系统和导航菜单等场景尤为有用。通过简洁的API接口,开发...

weixin_33431149的博客 3491

图像去模糊(二)——Richardson–Lucy算法

Richardson Lucy Algorithm(Richardson-Lucy算法详解及效果实例)

xueruhongchen的博客 3万+

tree.js实现3D效果,官网demo

官网地址:https://threejs.org/docs/index.html#manual/zh/introduction/Creating-a-scene 官网demo:一个自动旋转的正方形 这个tree.js主要用的是3D模型图,图可是gitf,3D max制作3D模型 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>index

test_00的博客 1万+

STM32duino LSM6DSO驱动库:低功耗IMU工程化实践

惯性测量单元(IMU)是智能终端与工业设备实现运动感知的核心传感器,其性能关键在于数据精度、实时响应与系统功耗的协同优化。LSM6DSO作为集成加速度计与陀螺仪的六轴MEMS器件,依托片上有限状态机(FSM)和机器学习核心(MLC),支持自由落体检测、计步器、6D方向识别等硬件自治功能,显著降低主控CPU负载。在STM32平台下,通过深度耦合HAL/LL库、显式引脚管理、DMA加速SPI传输及EXTI中断协同,可实现亚毫秒级事件响应与微安级待机功耗。本文聚焦STM32duino生态中LSM6DSO驱动的工程

weixin_36304957的博客 551

javascript数据结构与算法-- 二叉树

树是一种非线性的数据结构,以分成的方式存储数据,树被用来存储具有层级关系的数据,比如文件系统的文件,树还被用来存储有序列表。1. 二叉树是由节点组成的,所以我们需要定义一个对象node,可以保存数据,也可以保存其他节点的链接(left 和 right),show()方法用来显示保存在节点中的数据。Current = current.left 因此current = null;当执行current = current.right;这句代码的时候,那么当前current = 45的那个节点(如上图所示);

2401_86940371的博客 1628

HFSS实战项目——基片集成波导(SIW)带通滤波器

设计了一款直接耦合的SIW带通滤波器, 采用直接耦合的形式, 工作频率覆盖19~21 GHz, 通带内插入损耗小于1.5 dB, 回波损耗小于-20 dB, 带外抑制特性良好.

2401_87464239的博客 4895

ADT MCP Server 把 ABAP 开发带进 Agent 模式

今天讨论 ADT MCP Server,不能只把它看成 Visual Studio Code 里多出来的一个开关。它真正有意思的地方,在于它把 ABAP 后端开发里那些原本需要手工点击、手工创建、手工激活、手工查服务元数据的动作,包装成一组可以被 GitHub Copilot 这类 coding agent 调用的工具。SAP 在 RAP130 练习里把它描述为运行在 ADT for Visual Studio Code 扩展内部的本地 HTTP Server,它实现的是 Model Context Pro

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 183

Tech Interview Handbook:树(Tree)编码面试专题——遍历、BST 性质与递归技巧全解

本文基于 [Tree 专题文档](https://link.gitcode.com/i/ef876c4b444387757ba842eb29b248f4) 展开,系统讲解二叉树与二叉搜索树(BST)的核心术语、三种遍历方式的递归与迭代写法、BST 的复杂度特性,以及面试中必须熟练掌握的递归技巧、分层遍历与常见边角用例。仓库内还附带了 Python / JavaScript 的遍历与树操作参考实现,

gitblog_00970的博客 192

4.1 AI Agent对比分析:Coze、Dify、LangGraph,如何选择Agent框架

本文对比分析了三大主流AI Agent框架:Coze(字节跳动平台,可视化开发,适合快速企业应用)、Dify(开源企业级方案,支持定制部署)和LangGraph(代码开发灵活,适合复杂需求)。选择指南建议:需要快速开发选Coze,需开源定制选Dify,复杂灵活需求选LangGraph。核心要点包括理解各框架特点、根据需求评估选择,并提供了实践建议。下节将介绍Coze平台的实战应用。

yonggeit的博客 3145

Java:99-数据结构与算法(上篇)

代码也的确解决了对应的问题,我们可以发现,他的解决方式 只是将自身依次的除以"2到自身减一"(包括2和自身减一)的所有数 只要有一个的余数为0,就代表是质数 我们发现,他的存储方式是赋值(数据结构),而解决问题的方式(算法)是利用循环操作 但是在数字越来越大时,他的执行时间,可能会变慢,你可以试着将值修改成2147483647,会发现,明显变慢了 接下来,我将使用一点数学知识或者说数学思维(虽然并不是很高大上,但也只是告诉你,数学的作用而已),来使得他进行优化 即我们需要减少循环,那么我们继续分析质数,有什

qq_59609098的博客 611

01-系统技术架构师必备——软件架构设计基础与核心概念

摘要 本文系统阐述了软件架构设计的核心概念与方法论,重点涵盖以下内容:1)软件架构的四大要素(构件、连接件、约束、配置)及其边界划分;2)Garlan & Shaw五大架构风格(数据流、调用/返回、独立构件、虚拟机、仓库)的典型应用场景;3)基于电商库存系统的架构选型实战案例,展示如何根据业务需求(高并发、最终一致性)选择事件驱动架构配合Saga模式;4)介绍ABSD、DSSA等主流架构方法论及ISO/IEEE标准体系。文章融合金融与互联网领域的架构实践经验,为技术架构师提供系统性的知识框架和决策参考。

模界 | AI工程化实践者 181

SolidWorks速成教程P1——简介及基础操作

SolidWorks教程P1——简介及基础操作

嵌入式阿齐Archie 2万+

jslm 实战指南:用 JavaScript 训练可在浏览器端实时运行的自适应语言模型(PPM / Histogram / Pólya Tree)

[jslm](https://link.gitcode.com/i/793768ce36006805f38ff92a3413dcbb) 是 google-research 仓库中的一个纯 JavaScript 目录,提供一组**内存与计算开销都足够低、可以在浏览器中"边看边学"的自适应语言模型**。本文以该目录官方 README 为主体,结合 [ppm_language_model.js](htt

gitblog_00927的博客 457

Python爬虫终极指南:异步爬虫+Playwright逆向,高效爬取携程旅游数据

Playwright解决动态渲染和加密参数难题,模拟真实浏览器环境;aiohttp异步提升抓取效率,结合代理池和并发控制规避风控;指纹伪装、行为模拟等技巧大幅降低被检测概率。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2949

2 步跑通 Cerebro 全局启动器:一个输入框搞定日常操作

Cerebro 是一个开源桌面启动器。你在任意界面按下全局快捷键,屏幕上就会浮出一个输入框,打字即可完成任务:启动应用、搜索网页、计算数值、打开文件。 ## 和普通启动器的差别 没有 Cerebro 时,你想做一件小事要经历完整链路:切窗口、找图标、点菜单,动作分散在屏幕各处。装上之后,所有入口收敛到同一个输入框:结果列在下方,用 `ctrl+1` 到 `ctrl+9` 直接选中某一条,回车执

gitblog_00975的博客 173

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Nim 高级特性实战指南(Part II):面向对象、异常、泛型与模板全解析

> **导读**:本文基于 Nim 官方教程第二篇([doc/tut2.md](https://link.gitcode.com/i/552de80026f92bb52f3ca3738c5b879d))编写,系统讲解 Nim 的高级语言构造——包括面向对象编程(继承、接口模拟、对象变体、动态分派)、异常处理体系、泛型编程与模板元编程,并补充 JavaScript 后端编译注意事项。文中所有示例均取

gitblog_00197的博客 1033

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Wren 语言性能深度解析:基准测试、字节码虚拟机优化与实现原理

本篇技术指南围绕 Wren 官方文档中的性能章节展开,全面梳理 Wren 在方法调用、对象分配、递归等基准测试中的表现,并深入剖析其字节码虚拟机(bytecode VM)在值表示、对象布局、方法分发、指令派发与编译流程上采用的六项关键优化手段。通过阅读本文,你将理解 Wren 如何在保持"类 C 的简单实现"的同时达到可投入实际使用的运行速度,并掌握这些优化在仓库源码中的具体落点,为评估嵌入场景或

gitblog_01092的博客 90

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

fast-check 递归结构与实体图生成全指南:letrec、memo 与 entityGraph 实战详解

本文聚焦 fast-check(基于 TypeScript 的 Property Based Testing 框架,类似于 QuickCheck)中三类专用于生成递归数据结构的组合子(combiners):`fc.letrec`、`fc.memo` 与 `fc.entityGraph`。你将掌握如何用它们生成树、AST、JSON 等自引用结构,如何通过 `depthSize`、`maxDepth`

gitblog_01188的博客 510

线段树入门、总结 Interval Tree

线段树入门级总结 By Jsn1993 最近学习了线段树这一种数据结构,也做了不少关于线段树的入门级题目,大致对线段树有 了一个了解。稍稍总结一下(文字没有参考别人的成分)。 一、 初识线段树 1、 称谓及意义 线段树我习惯用英文称呼它(Interval Tree)。Interval 代表区间,恰恰说明了线段树是一种基 于区间的数据结构。 2、 线段树的表示 线段树是一棵二叉树,

Ac Dream 3342

Coding Interview University 学习指南:一套完整的计算机科学自学计划,从零系统备战软件工程师面试

Coding Interview University 是当前仓库中一份长达数千行的计算机科学自学计划,其法语版本见 [translations/README-fr.md](https://link.gitcode.com/i/b1c269f0d468eaefb267cfa2ef6aeda8)。它的定位非常明确:帮助没有计算机科学学位的自学者(尤其是 Web 开发者),在几个月内按部就班补齐数据结

gitblog_00976的博客 174

树模型面试实战:分裂原理、剪枝权衡与部署妥协

决策树不是静态算法,而是数据分布、计算效率与业务约束共同塑造的动态建模范式。其核心在于分裂准则如何平衡信息增益与过拟合风险(如信息增益比抑制高基数特征偏好),剪枝策略如何量化模型复杂度与泛化能力(如ccp_alpha实现单位叶节点收益考核),以及部署时如何在延迟、内存与可解释性间做工程取舍(如ONNX序列化、代理分裂处理缺失值)。理解这些底层权衡,才能应对真实场景中的类别不平衡、稀疏特征失效、概念漂移监控等挑战,真正将树模型从教科书公式转化为可调试、可诊断、可落地的工业级组件。

weixin_33787529的博客 527

NoSQL 技术选型与数据库索引数据结构实战指南——基于 db-tutorial 开源仓库

> 本文以 db-tutorial 项目"数据库综合"章节的两篇核心文档([Nosql 技术选型](https://link.gitcode.com/i/59b2a0807134c13a4526867200432857) 与 [数据结构与数据库索引](https://link.gitcode.com/i/2442be2b704464b9a4cdbbf5d1a9aac1))为主体,系统梳理五大类 N

gitblog_06839的博客 197
上一篇: javascript 散列表(Hashes)算法与说明
下一篇: javascript AVL树算法与说明
JarunWang
博客等级 码龄18年 57粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值