js实现二叉查找树的建立、插入、删除、遍历操作

JavaScript数据结构之 —— 09二叉查找树(二叉搜索树) 树结构对比于数组/链表/哈希表有哪些优势 数组: 优点:可以通过下标值访问,效率高; 缺点:在插入和删除元素时,需要大量的位移操作; 链表: 优点:数据的插入和删除操作效率都很高; 缺点:查找效率低,需要从头开始依次查找,直到找到目标数据为止;当需要在链表中间位置插入或删除数据时,插入或删除的效率都不高。 哈希表: 优点:哈希表的插入/查询/删除效率都非常高; 缺点:空间利用率不高,底层使用的数组... 阅读详情

1 概念

二叉排序树(二叉查找树),它或者是一颗空树,或者是具有以下性质的二叉树:

  • 任意一个结点左子树上的所有结点值均小于该结点值
  • 任意一个结点右子树上的所有结点值均大于该结点值

例如下图:
这里写图片描述

2 插入和建立二叉排序树

结点的数据结构

function newNode(value){
    this.value = value;
    this.left = null;
    this.right = null;
}

插入操作
插入操作很简单,即用递归依次比较插入值与结点值的大小,找到插入的位置

function InsertNode(root, key){
    if (!root.value){   //如果根结点不存在,则建立根结点
        root.value = key;
        return true; 
    }

    if (root.value > key){  //当前结点值比插入值大,说明插入位置在当前结点值的左子树中
        if (root.left){  //如果有左孩子结点,继续比较
            InsertNode(root.left, key);
        }else{   //插入操作
            root.left = new newNode(key);
        }
    }else if (root.value < key){ //当前结点值比插入值小,说明插入位置在当前结点值的右子树中
        if (root.right){ //如果有右孩子结点,继续比较
            InsertNode(root.right, key);
        }else{  //插入操作
            root.right = new newNode(key);
        }
    }else{  //树中已存在插入值的结点
        return false;
    }

    return true;
}

建立操作
二叉排序树的建立就是多次执行插入操作

function create(array){
    var tree = new newNode(null);  //建立根节点
    for (let i=0; i < array.length; i++){
        InsertNode(tree, array[i]);
    }
    return tree;
}

3 遍历

二叉排序树中序遍历的输出结果就是结点值从小到大排序的结果

function InOrderTraverse(root){
    if (!root) return;
    InOrderTraverse(root.left);
    console.log(root.value);
    InOrderTraverse(root.right);
}

4 删除操作

删除操作稍微复杂一些。思路在于首先找到删除值的结点,若该结点是叶子结点,则直接将其置为null,若其具有左子树或右子树,则将左孩子结点或右孩子结点赋值给当前结点。若当前结点既有左子树,又有右子树,则在其左子树中,寻找一个和当前结点值最接近的孩子结点(即中序遍历结果中当前结点的前驱),将当前结点的值替换为该孩子结点的值,替换后,树中此时就有两个重复的值,因此,再利用递归删除重复的孩子结点,依次类推。。。

function deleteNode(root, key){
    if (!root){
        console.log("删除失败");
        return root;
    }

    if (root.value > key){  //若当前结点值大于删除值,则继续在左子树中寻找删除值
        root.left = deleteNode(root.left, key);
    }else if (root.value < key){  //若当前结点值小于删除值,则继续在右子树中寻找删除值
        root.right = deleteNode(root.right, key);
    }else{  //找到与删除中相等的结点
        if (root.left === null & root.right === null){  //叶子结点
            root = null;
        }else if (root.left === null){  //只有右子树
            root = root.right;
        }else if (root.right === null){  //只有左子树
            root = root.left;
        }else{  //同时具有左右子树
            let prevNode = root.left;
            while(prevNode.right){  //寻找不大于当前结点值的最大结点值
                prevNode = prevNode.right;
            }
            root.value = prevNode.value;  //替换值
            root.left = deleteNode(root.left, prevNode.value);  //递归左子树,删除重复值的结点
        }
    } 
    return root;
}
纯js的树形菜单(添加删除节点) 纯js的树形菜单(添加删除节点)动态添加父节点子节点。jquery实现 立即下载

相关推荐

论文浅读之PIP-Net: Patch-Based Intuitive Prototypes for Interpretable Image Classification

这篇文章的主要贡献包括:1 提出了一种新型的可解释图像分类模型PIP-Net,它基于原型部分学习可解释的原型,实现内置解释性。2 PIP-Net采用自监督学习的新正则化方法,学习原型之间的相似性,使得 latent 空间中的相似性能更好地与人类视觉感知相一致,从而减小了所谓的语义差距。3 PIP-Net可解释为一个稀疏的打分表,它可以检测图像是否属于任何类,或是否属于多个类。它也可以对OOD数据进行分类并说“我没有看到过这个”。

qq_49370210的博客 1791

JS实现二叉搜索树【增删改查】(详解)

摘要 如果说一个数据结构的出现一定是因为它能解决某些问题,我们传统的线性表有数组和链表,前者在改查的优势更大,后者在增删的优势更大。 但是往往在应用中这些功能我们是都需要用到的,在对数组或者链表的选择上就有了一些决定性。 而二叉搜索树是具备了数组改查快和链表增删快的特点而生的一种数据结构。 二叉搜索树具有二叉树的特点,并且,每个节点的左子树中所有节点都是比当前节点的值小的,每个节点的右子树所有节点都是比当前节点的值大的。 正是这种特点,使它在数据操作和检索操作上具有很高的效率。 OK,这一篇我们主要用JS来

weixin_46726346的博客 880

手把手教你用Copilot插件在Obsidian里免费接入DeepSeek-R1(附硅基流动API密钥获取)

本文详细介绍了如何通过Copilot插件在Obsidian中免费接入DeepSeek-R1模型,实现智能知识管理。从硅基流动API密钥获取到插件配置,再到高级功能调优和实战应用技巧,手把手教你打造AI驱动的个人知识库。

weixin_33686714的博客 2794

删除二叉搜索树中的节点,力扣405题

这种情况下,按照二叉搜索树的删除的官方做法,是找到它的前驱节点(左子树中最右边的结点),或者是找到它的后继结点(右子树中的最左边的结点)。将它作为根节点,然后原来的左子树作为新的左子树,原来的右子树作为新的右子树。// 同时,网上还有另外一种做法,就是将左子树整个的挂在右子树的最左边的结点的左孩子下,返回右子树的根作为新的根节点,这样也可以,但是这样好像会不断地增加树地高度,最终这个树会变成一个链表。// 2.左孩子为空,右孩子不为空,直接删除根结点,返回右孩子结点作为删除之后的树。

qq_52983535的博客 306

手把手教你用OPA运放和MOS管搭建恒流源电路(附完整电路图)

本文详细介绍了如何使用OPA运放和MOS管搭建高精度恒流源电路,涵盖核心元器件选型、电路设计、工作原理及实际搭建步骤。通过负反馈控制机制和MOS管工作区设置技巧,实现稳定的电流输出,适用于LED驱动、电池充电等场景。附完整电路图和调试技巧,助您快速掌握恒流源设计。

weixin_29239279的博客 535

Ubuntu18.04环境搭建与疑难解析:从零复现YOLO-6D姿态估计算法

本文详细介绍了在Ubuntu18.04环境下从零开始复现YOLO-6D姿态估计算法的完整流程,包括系统配置、Conda环境搭建、PyTorch安装、依赖项管理、源代码获取、数据集准备以及训练验证过程。针对Singleshotpose算法的特殊需求,提供了详细的疑难解析和性能优化技巧,帮助开发者高效完成算法复现和应用部署。

weixin_30369041的博客 456

js 删除节点_js实现二叉搜索树

最近在学习数据结构和算法,所以用js来实现一下二叉搜索树,检验学习效果。 首先,我们来简单说一下什么是二叉搜索树,它有什么特性: 二叉搜索树(二叉查找树)不同于普通二叉树,是它的左子树所有的节点都小于根节点,右子树所有的节点都大于根节点,并且其左右子树也是二叉搜索树。图丑也可以看 二叉搜索树的概念不多说,具体来看看js代码:二叉搜索树类 上图,写了一个二叉搜索树的类...

weixin_39968410的博客 278

从官方例程到实战:AXI Memory Mapped To PCIe 核在FPGA-RC模式下的配置与调试全解析

本文详细解析了AXI Memory Mapped To PCIe核在FPGA-RC模式下的配置与调试方法。从IP核基础结构到实战参数设置,再到例程代码剖析和调试技巧,全面覆盖了AXI与PCIe协议转换的关键技术点,帮助开发者高效实现FPGA与PCIe设备的高速数据交互。

weixin_42550597的博客 267

JavaScript实现二叉树遍历、查询、删除

JavaScript实现数据结构可以提高我们的效率,本文介绍JavaScript实现二叉树的遍历。 二叉树中序、前序、后序遍历大家应该了解,指的是根节点遍历的顺序 首先我们建立一个二叉查找树(二叉排序树),从开始节点作为根节点,对其遍历插入,具体代码如下: function BinaryTree(){ var Node = function(key) { this.key = key;...

山鬼谣弋痕夕的博客 1108

【Cursor+Playwright-MCP 实现 AI 自主功能测试】含实例代码脚本+保姆级教程

本文档详细介绍了如何使用 Cursor(AI 编程助手)和 Playwright-MCP 库实现基于 GPT 模型的自动化功能测试。文档从环境搭建开始,逐步指导读者如何通过 Playwright 进行浏览器自动化,并利用 Playwright-MCP 集成 GPT 模型生成测试计划、执行测试步骤及生成测试报告。核心步骤包括安装依赖、配置 OpenAI API 密钥、编写代码实现 AI 驱动的测试流程,以及生成详细的测试报告。通过本文档,读者可以快速掌握从 0 到 1 实现 AI 自主功能测试的全流程。

Dreams°的博客 2893

【华为OD机试真题E卷】514、学生方阵 | 机试真题+思路参考+代码分析(E卷复用)(C++、Java、Py)

【华为OD机试真题E卷】514、学生方阵 | 机试真题+思路参考+代码分析(E卷复用)(C++、Java、Py) 题目描述 学校组织活动,将学生排成一个矩形方阵 请在矩形方阵中找到最大的位置相连的男生数量 这个相连位置在一个直线上,方向可以是水平的,垂直的,成对角线的或者呈反对角线的 注:学生个数不会超过10000

KJ.JK 2492

【数据结构与算法】详解什么是树结构,并用代码手动实现一个二叉查找树

本篇文章将开始讲解树结构。其实树结构是平日里我们常见的一种数据结构,例如家族族谱、公司管理层级结构图等,这样的数据结构的存在一定有一定的道理。因此,在计算机领域中,树结构也是会被广泛用到的,例如数据库系统中就有用到。那么本文就从零开始学习一下树结构,并且也会封装一个二叉查找树,本文 3万+ 的详细教程,希望大家耐心观看,我是以一个纯小白的角度来写的这篇文章,相信大家认真看一定都能看懂的

零一的博客 2万+

QGis软件 —— 2、QGis加载在线地图两种方式(谷歌地图、天地图)

QGis软件 —— 2、QGis加载在线地图两种方式(谷歌地图)

1万+

数据结构 js实现二叉查找树

二叉查找树 二叉查找树(BST), 又叫做二叉排序树,二叉搜索树,是一种对查找和排序都有用的特殊二叉树。 二叉查找树或者空树,或者满足下面三个性质: 1、若其左子树非空,则左子树上所有结点的值都小于根节点的值。 2、若其右子树非空,则右子树上所有结点的值都大于根节点的值。 3、其左右子树都是一棵二叉查找树。 二叉查找树的特性:左子树 < 根 < 右子树, 即二叉查找树的中序遍历是一个递增序列。 二叉查找树的查询 因为二叉查找树的中序遍历有序性,即得到的递增的序列,由于有序,查找与二分查找类似,

qq_36723759的博客 796

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

js遍历树节点下的所有子节点_数据结构 | 二叉查找树

本文根据网上资料和自己学习所得整理而成,思维导图如下,希望对你有用。1 定义 二叉查找树是二叉树中最常用的一种类型,也叫二叉搜索树。它支持快速的查找,插入,删除一个数据。做到这些,依赖于它特殊的结构。二叉查找树的结构是这样的,在树中任意一个节点,其左子树中的每个节点的值,都要小于这个节点的值,而右子树的值都大于这个节点的值。简单来说,就是对任意一个节点,左右子树满足左小右大的特点。二叉查找树2 二...

weixin_39710251的博客 1245

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

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

阅读周·数据结构与算法JavaScript描述 | 二叉树和二叉查找树

背景去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。没有计划的阅读,收效甚微。新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一本书籍。这个“玩法”虽然常见且板正,但是有效,已经坚持阅读四个月。已读完书籍:《架构简洁之道》、《深入浅出的Node.js》、《...

cnzzs的博客 854

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

二叉查找树删除操作

二叉查找树中,最复杂的操作就是删除操作。对于叶子节点,直接删除即可。对于一颗子树的节点,用子树取代原节点即可。对于拥有两颗子树的节点,首先用右子树最小的节点取代源节点,再递归删除此最小节点。 具体代码如下所示: [java] view plaincopyprint? package com.Algorithm.Tree;  import java.util.*;  imp

chummyhe89的专栏 932

JS 实现自平衡二叉查找树(AVL树)

该树的代码基本上是从我上篇文章 JS 实现二叉查找树 加入平衡因子,高度,旋转等 AVL 树的概念升级而来,写的过程中发现,思想就一个递归,细节就是递归处理操作的时候严不严谨,难点就是概念的理解的准不准确。

三月的船长 480

二叉查找树

1.首先,二叉树是什么

少油少盐不要辣 203

JavaScript -- 二叉查找树的JavaScript的描述

我首先看一下什么是树。 树是计算机科学中经常用到的一种数据结构。树是一种非线性的数据结构,以分层的方式存储数据。树被用来存储具有层级关系的数据,比如文件系统中的文件; 这是一颗普通的树。 二叉树是一种特殊的树,它的子节点个数不超过两个。二叉树有许多优秀的性质。 二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。 二...

wust_cyl的博客 302

二叉搜索树的概念以及js实现增删操作

二叉搜索树 js 1、概念 二叉搜索树又称二叉查找树、二叉排序树。它满足如下性质 它的所有左子树上面的节点均比它小 它的所有右子树上面的节点均比它大 它的左右子树也满足二叉搜索树的性质 2、二叉搜索树的数据结构 function TreeNode(data) { this.data = data; // 实际的数据 this.lchild = null; // 左节点 this.rchild = null; // 右节点 } 3、二叉搜索树的操作 3.1 插入 插入的

l908825925的博客 189

使用JS去实现一个BST(二叉查找树)

BST(二叉查找树) 树的概念: 根节点:没有父节点 节点:有父节点和子节点 深度:当前节点的祖先节点数量 高度:所有节点深度最大值 子树:由节点和它后代节点组成 二叉树:节点只能有两个子节点 左节点(比父节点小) 右节点(比父节点大或等于) 中序遍历:左节点-节点-右节点(用于排序) 先序遍历:节点-左节点-右节点(用于打印结构化文档) 后续遍历:左节点-右节点-节点 function...

weixin_33753845的博客 370

js数据结构第九弹:二叉树和二叉查找树

树是一种非线性的数据结构, 以分层的方式存储数据。 树被用来存储具有层级关系的数据, 比如文件系统中的文件; 树还被用来存储有序列表。 优点:在二叉树上进行查找非常快(而在链表上查找则不是这样), 为二叉树添加或删除元素也非常快(而对数组执行添加或删除操作则不是这样)。 1 树的定义 树由一组以边连接的节点组成。 每个方框都是一个节点, 连接方框的线叫做边。 一棵树最上面的节点称为根节点, 如果一...

weixin_43187545的博客 205

leetcode二叉树及三种遍历方式理解(动画演示说明)JavaScript

二叉树 树是一种非线性的数据结构,以分层的方式存储数据。树被用来存储具有层级关系的数据,比如文件系统中的文件;树还被用来存储有序列表。本章将研究一种特殊的树:二叉树。选择树而不是那些基本的数据结构,是因为在二叉树上进行查找非常快(而在链表上查找则不是这样),为二叉树添加或删除元素也非常快(而对数组执行添加或删除操作则不是这样)。 ​ 二叉树是一种特殊的树,它的子节点个数不超过两个。二叉树具有一些特殊的计算性质,使得在它们之上的一些操作异常高效。 二叉树的高度和深度的区别: ​ 高度和深度是相反的表示,深度是

WEXIA666的博客 777

二叉树与二叉查找树

一、树的相关术语 树是一种非线性的数据结构,以分层的形式存储数据 树由一组以边连接的节点组成,如下: 树的层数被定义为树的深度 二、二叉树 二叉树是一种特殊的树,规定每个节点的子节点不能超过两个 通过将子节点的个数设置为2,可以高效地在树中插入、删除、查找数据 二叉查找树是一种特殊的二叉树,相对较小的值保存在左节点上,较大的值保存在右节点上,这一特性使得查找的效率很高 三、二叉查找树的实现1

骑着毛驴的小猴子 819
上一篇: 史上最简单的无缝衔接轮播图
下一篇: 二进制中1的个数(JS实现)
PAT-python-zjw
博客等级 码龄10年 381粉丝 408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值