首页 > 其他分享 >JS 二叉搜索树

JS 二叉搜索树

时间:2024-03-24 12:12:16浏览次数:12  
标签:right cur val JS 二叉 num 搜索 null left

Code:

class TreeNode {
    val;
    left;
    right;
    constructor(val, left, right) {
        this.val = val ?? 0;
        this.left = left ? left : null;
        this.right = right ? right : null;
    }
}

/**
 * 二叉搜索树
 */
class BinarySearchTree {
    /**
     * @type {TreeNode}
     */
    #root;

    /**
     * @constructor
     */
    constructor() {
        this.#root = null;
    }

    getRoot() {
        return this.#root;
    }

    /**
     * 插入新节点
     * @param {number} num 
     */
    insert(num) {
        if (this.#root === null) {
            this.#root = new TreeNode(num);
            return;
        }

        let prev = null;
        let cur = this.#root;

        // 到达叶子节点后退出
        while (cur !== null) {
            // 已经存在某个节点的值与待插入的新值相等
            if (cur.val === num) {
                return;
            }
            prev = cur;
            // 插入值比当前节点的值要大
            if (num > cur.val) {
                cur = cur.right;
            }
            // 比当前值小
            else {
                cur = cur.left;
            }
        }

        const node = new TreeNode(num);
        if (num > prev.val) {
            prev.right = node;
        }
        else {
            prev.left = node;
        }
    }

    /**
     * 查找节点
     * @param {number} num
     * @returns {TreeNode}
     */
    search(num) {
        let cur = this.#root;
        while (cur !== null) {
            if (cur.val < num) {
                cur = cur.right;
            }
            else if (cur.val > num) {
                cur = cur.left;
            }
            else {
                break;
            }
        }

        return cur;
    }

    /**
     * 删除节点
     * @param {number} num 
     * @returns 
     */
    remove(num) {
        if (this.#root === null) {
            return;
        }

        let prev = null;
        let cur = this.#root;

        while (cur !== null) {
            if (cur.val === null) {
                break;
            }
            prev = cur;
            if (cur.val < num) {
                cur = cur.right;
            }
            else {
                cur = cur.left;
            }
        }

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

        //// 子节点数量为 0 或者 1
        if (cur.left === null || cur.right === null) {
            const child = cur.left === null ? cur.right ? cur.left;
            if (cur === this.#root) {
                this.#root = child;
            }
            else {
                if (prev.left === cur) {
                    prev.left = child;
                }
                else {
                    prev.right = child;
                }
            }
        }
        //// 子节点数量为 2
        else {
            let tmp = cur.right;
            while (tmp.left !== null) {
                tmp = tmp.left;
            }
            this.remove(tmp.val);
            cur.val = tmp.val;
        }
    }
}

 

标签:right,cur,val,JS,二叉,num,搜索,null,left
From: https://www.cnblogs.com/fanqshun/p/18080393

相关文章

  • js一些底层
    简介:JavaScript是一种高级编程语言,通常在网页开发中用于前端和后端开发。JavaScript的底层实现是浏览器或服务器上的JavaScript引擎。不同的引擎可能有不同的底层实现,但它们都有一个共同的目标,即执行JavaScript代码。JavaScript的底层实现涉及到多个方面,包括解释器、......
  • React&Nest.js社区平台(四)——✏️文章发布与管理实战
    公众号:【可乐前端】,每天3分钟学习一个优秀的开源项目,分享web面试与实战知识。前言在上一期我们已经实现了个人信息模块,这一期来实现文章发布与管理。涉及到如下功能:草稿创建/修改文章发布文章删除获取我发布的文章看起来像是文章的增删改查功能,其实还是有不少值得思考......
  • 【附源码】Node.js毕业设计高校拼车系统(Express)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着社会的发展与科技的进步,人们对于出行方式的需求日益多样化,尤其是在高校校园内,学生、教职工等群体的出行需求频繁而复杂。传统的出行方式如步行、自行车......
  • 【附源码】Node.js毕业设计高校排课系统设计(Express)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着信息技术的飞速发展,高校教育管理逐渐向数字化、智能化方向迈进。在这一背景下,高校排课系统作为教育管理的重要组成部分,其优化与改进显得尤为重要。传统......
  • vue2 在 main.js 中定义全局函数,在二次封装的 api\index.js 中引用全局函数 GPT4 Tur
    在Vue2中,你可以通过Vue的原型系统来定义全局函数,然后在整个应用的任何组件中使用这些函数。同样,你也可以在其他JavaScript文件中使用这些函数,比如你提到的二次封装的API文件。下面是如何实现这一过程的步骤:###第一步:在`main.js`中定义全局函数在Vue项目的入口文件`main.js`中,你......
  • 数据结构(五)——二叉树的遍历和线索二叉树
    5.3.二叉树的遍历和线索二叉树5.3.1_1二叉树的先中后序遍历遍历:按照某种次序把所有结点都访问一遍二叉树的递归特性:        ①要么是个空二叉树        ②要么就是由“根节点+左子树+右子树”组成的二叉树先序遍历:根左右(NLR)中序遍历:左根右(LNR)后序遍......
  • 快速上手 Vue.js 框架:初学者指南
    快速上手Vue.js框架:初学者指南Vue.js是一个轻量级且灵活的JavaScript框架,专为构建交互式的Web界面而设计。它的设计哲学是使得开发者可以轻松上手,同时提供强大的功能来构建复杂的单页应用(SPA)。如果你是前端开发的新手,或者想要学习一种新的框架来提升你的技能,那么Vu......
  • antdesign protable 修改搜索区Form item的placeholder
    默认protable搜索去的placeholder为请输入或者请选择: 需要修改为其他内容,配置 constcolumns=[  {   title:'项目',   dataIndex:'project',   valueEnum:currentUser.projects.reduce((r,c)=>{    r[c]=c;    re......
  • 跳马【华为OD机试JAVA&Python&C++&JS题解】
    一.题目马是象棋(包括中国象棋和国际象棋)中的棋子,走法是每步直一格再斜一格,即先横着或直着走一格,然后再斜着走一个对角线,可进可退,可越过河界,俗称“马走‘日’字。给顶m行n列的棋盘(网格图),棋盘上只有有棋子象棋中的棋子“马”,并且每个棋子有等级之分,等级为k的马可以跳1~k......
  • leedcode-二叉树的所有路径
    迭代法-深度优先搜索classSolution:defbinaryTreePaths(self,root:Optional[TreeNode])->List[str]:ifnotroot:return[]#如果根节点为空,直接返回空列表stack=[(root,str(root.val))]#初始化栈,栈中存储的是节点......