51 # 二叉搜索树的实现

news2024/9/22 11:43:00

实现二叉搜索树

比如我们有数组:

[10, 8, 19, 6, 15, 22, 20]

需要把数组转为二叉搜索树,效果如下:

在这里插入图片描述

// 节点
class Node {
    constructor(element, parent) {
        this.element = element; // 存的数据
        this.parent = parent; // 父节点
        this.left = null; // 左子树
        this.right = null; // 右子树
    }
}

class BST {
    constructor(compare) {
        this.root = null;
        this.size = 0; // 节点个数
        this.compare = compare || this.compare;
    }
    compare(e1, e2) {
        return e1 - e2;
    }
    // 添加节点
    add(element) {
        // 如果根元素不存在
        if (this.root === null) {
            this.root = new Node(element, null);
            this.size++;
            return;
        } else {
            // 如果根元素存在,那么增加的就不是根节点,需要找到 parent
            let currentNode = this.root;
            // 当前比较的结果
            let compare = 0;
            // 先找到需要对比的 parent(当前父节点)
            let parent = null;
            while (currentNode) {
                parent = currentNode;
                compare = this.compare(element, currentNode.element);
                // 如果大于 0 找右树,小于 0 找左树
                if (compare > 0) {
                    currentNode = currentNode.right;
                } else if (compare < 0) {
                    currentNode = currentNode.left;
                } else {
                    // 如果比较后结果一样,由自己决定是否需要覆盖
                    currentNode.element = element; // 覆盖
                    return;
                }
            }
            // 找到了 parent,生成新节点
            let newNode = new Node(element, parent);
            if (compare > 0) {
                parent.right = newNode;
            } else {
                parent.left = newNode;
            }
        }
    }
}

let bst = new BST();

let arr = [10, 8, 19, 6, 15, 22, 20];

arr.forEach((element) => {
    bst.add(element);
});

console.dir(bst.root, { depth: 100 });

在这里插入图片描述

自定义比较器:

let bst = new BST((e1, e2) => {
    return e1.age - e2.age;
});

let arr = [
    {
        name: "凯",
        age: 3
    },
    {
        name: "小",
        age: 1
    },
    {
        name: "默",
        age: 3
    },
    {
        name: "的",
        age: 6
    },
    {
        name: "博",
        age: 7
    },
    {
        name: "客",
        age: 8
    }
];

arr.forEach((element) => {
    bst.add(element);
});

console.dir(bst.root, { depth: 100 });

由于我们判断的时候用了覆盖,可以看到 这个节点被 覆盖了

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/728733.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

订座排队小程序/H5/app【附源码】

订座排队小程序/H5/app 可看 应用效果 首页 答题活动规则 选择门店暂无门店 订座订座 订座成功 用户反馈订座 关于后端

抖音seo源码/源码开发部署环境配置及流程分享

抖音seo源码开发部署环境配置&#xff1a; 要配置抖音seo源码开发环境&#xff0c;您需要完成以下步骤&#xff1a; 安装 Python&#xff1a;请在官网下载 Python 并进行安装。 安装 Django&#xff1a;请在命令行中输入以下命令来安装 Django&#xff1a; pip install django…

双周连载 | 暗网分析报告Part 1:他们无法保护你

双周连载 | 暗网分析报告Part 1&#xff1a;他们无法保护你 暗网&#xff0c;一个人们讳莫如深的世界&#xff0c;一个充斥着悄无声息的威胁&#xff0c;似乎永久地悬在我们每个人的头顶。这是一个罪恶的不法之地&#xff0c;时刻散播着未知的可怕力量&#xff0c;这便是那些隐…

使用 Elastic 修剪传入日志体量

作者&#xff1a;Carly Richmond 记录日志还是不记录日志&#xff1f; 一直是软件工程师仍在努力解决的一个难题&#xff0c;这对站点可靠性工程&#xff08;SRE&#xff09;同事来说是不利的。 开发人员并不总能正确了解他们在应用程序中捕获的警告和错误的级别或上下文&#…

01-webpack的理解,解决了什么问题

一、背景 Webpack 最初的目标是实现前端项目的模块化&#xff0c;旨在更高效地管理和维护项目中的每一个资源 模块化 最早的时候&#xff0c;我们会通过文件划分的形式实现模块化&#xff0c;也就是将每个功能及其相关状态数据各自单独放到不同的JS 文件中 约定每个文件是一…

dubbo监控中心dubbo-admin老版本(dubbo-ops)使用

1、dubbo分组 在dubbo中&#xff0c;可以指定group&#xff0c;如下&#xff1a; <dubbo:registry protocol"zookeeper" address"${dubbo.registry.address}" client"curator" group"${dubbo.registry.group}" /> 使用proper…

差值结构的排斥能

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点&#xff0c;AB训练集各由5张二值化的图片组成&#xff0c;让差值结构中有7个1, 行分布是0&#xff0c;1&#xff0c;2&#xff0c;2&#xff0c;2列分布是1&#xff0c;2&#xff0c;4.统计迭代次数并排序。 得…

今年面试真的很难...

大家好&#xff0c;最近有不少小伙伴在后台留言&#xff0c;今年面试实在是太卷了&#xff0c;不知道从何下手&#xff01; 不论是跳槽涨薪&#xff0c;还是学习提升&#xff01;先给自己定一个小目标&#xff0c;然后再朝着目标去努力就完事儿了&#xff01; 为了帮大家节约…

应用层:文件传输协议FTP

1.应用层&#xff1a;文件传输协议FTP 笔记来源&#xff1a; 湖科大教书匠&#xff1a;应用层概述 湖科大教书匠&#xff1a;文件传输协议FTP 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 将某台计算机中的文件通过网络传送到可能相距很远的另一…

猿人学web刷题1

1.第一题 js混淆源码乱码 - 猿人学 : url 时间戳加密 右键遇到反调试&#xff0c;参考前面的文章 过反调试 2.ast解混淆 首页1.js 拿到 function oo0O0, 在<script>标签里面, 无法调试&#xff0c;分析自己提取出来&#xff0c;或则hook替换 加密逻辑存在于window.a中&a…

Linux分布式应用 Zabbix监控软件实例:监控NGINX的性能

实例&#xff1a;监控NGINX的性能 1.安装&#xff08;确认是否有状态统计模块&#xff09; yum -y install nginx 2.更改NGINX配置文件添加状态统计站点 vim /etc/nginx/nginx.conf #主配置文件 vim /etc/nginx/conf.d/default.conf #子配置文件location /nginx_status {stub_…

Docker 常用指令集合,更换镜像(Ubantu)

1.更换镜像 先进入root用户 cat /etc/docker/daemon.json 查看有没有镜像创建目录,创建并编辑damon,json文件 mkdir -p /etc/docker vim /etc/docker/daemon.json# 填写内容 {"registry-mirrors": ["https://h5rurp1p.mirror.aliyuncs.com"] } 重新启…

在工作中保持情绪稳定:策略与实践

一、引言 近期发生的新闻热点再度引发公众对稳定情绪和心理健康的关注。在快节奏的现代生活中&#xff0c;我们常常面临各种压力和挑战&#xff0c;这可能会导致情绪波动&#xff0c;甚至影响我们的工作和生活质量。有时候我们遇到的最大的敌人&#xff0c;不是运气也不是能力…

Kubernetes的介绍(组件、Pod)和 安装使用

目录 Kubernetes是什么&#xff1f; 跟Kubernetes相似的软件&#xff1a; k8s里有哪些组件&#xff1f; 官方网站&#xff1a;Kubernetes 组件 | Kubernetes master上的Control Plane组件 什么是组件&#xff1f; Pod是什么呢&#xff1f; 1、kube-apiserver …

Oracle的CentOS安装

1.CentOS环境 阿里云轻量型服务器 2核-4g内存-80G系统盘 2.Oracle下载 Oracle下载 Oracle 数据库免费 CPU 限制 Oracle 数据库免费版自动将自身限制为两个内核进行处理。例如&#xff0c;在具有 2 个双核 CPU&#xff08;四个核&#xff09;的计算机上&#xff0c;如果大量…

【在线文件管理】响应式文件管理AngularJS

目录 1.功能展示截图 2.实现代码 2.1HTML页面代码 2.2后台代码 2.2.1项目结构 2.2.2项目代码 其他问题 1.功能展示截图 项目中需要用到文件管理来自由控制文件的上传、下载、删除等&#xff0c;就想到做一个简单的在线文件管理功能。 支持在线编辑&#xff1a; 2.实现代…

Java基础---SPI

目录 典型回答 从面向接口编程说起 接口位于调用方所在的包中 接口位于实现方所在的包中 注意 如何定义一个SPI SPI的实现原理 SPI的应用场景 典型回答 Java中区分 API 和 SPI&#xff0c;通俗的讲&#xff1a;API 和 SPI 都是相对的概念&#xff0c;他们的差别只在语义…

从零开始的Android逆向工程,开启对应用程序内部的探索之旅

Android逆向有那些发展方向 安全评估&#xff1a; 逆向工程可以帮助安全专家分析和评估Android应用程序的安全性。通过逆向应用程序&#xff0c;发现潜在的漏洞和安全隐患&#xff0c;并提供改进建议&#xff0c;以加强应用程序的安全性。 应用改进和优化&#xff1a; 逆向…

java编码转换过程

常见的JAVA程序包括以下类别&#xff1a; *直接在console上运行的类(包括可视化界面的类) *JSP代码类&#xff08;注&#xff1a;JSP是Servlets类的变型&#xff09; *Servelets类 *EJB类 *其它不可以直接运行的支持类 这些类文件中&#xff0c;都有可能含有中文字符串&…

KDE缺少全屏启动器的解决办法

我记得以前KDE是有一个全局搜索的启动起来着&#xff0c;但是重装了一次之后发现只剩下一个半屏的了。解决方案如下 sudo apt-get install plasma-widgets-addons