使用 Javascript 实现各种树算法

使用 javascript 实现各种树算法

简单的树

我们需要始终从简单的算法开始,然后一步步走向复杂的算法。简单的树二叉树

class simpletree {    constructor(value) {        this.value = value;        this.children = [];    }    insertchild(value) {        const newchild = new simpletree(value);        const lastelement = this.findlastchild(this);        lastelement.children.push(newchild);        return newchild;    }    findlastchild(root) {        if (root.children.length == 0) {            return root;        }        return this.findlastchild(root.children[0]);    }    traversal(root) {        console.log(root.value + ' --> ');        root.children.foreach(child => {            this.traversal(child);        })    }}const simpletree = new simpletree('a');simpletree.insertchild('b');simpletree.insertchild('c');simpletree.insertchild('d');simpletree.insertchild('e');simpletree.insertchild('f');console.log(simpletree)simpletree.traversal(simpletree)/*{    "value": "a",    "children": [        {            "value": "b",            "children": [                {                    "value": "c",                    "children": [                        {                            "value": "d",                            "children": [                                {                                    "value": "e",                                    "children": [                                        {                                            "value": "f",                                            "children": []                                        }                                    ]                                }                            ]                        }                    ]                }            ]        }    ]}*/

二叉树

class BinaryTree {    constructor(value) {        this.value = value;        this.left = null;        this.right = null;    }    insertNode(value) {        const newNode = new BinaryTree(value);        const {node: lastNode, side} = this.findAppropriatePlace(this, value);        lastNode[side] = newNode;        return newNode;    }    removeFromNode(value) {       this.findAppropriateNodAndrRemove(this, value);    }    findAppropriateNodAndrRemove(root, value) {        const side = root.value < value ? 'right' : 'left';        if (root[side].value == value) {            root[side] = null;            return ;        }        return this.findAppropriateNodAndrRemove(root[side], value);    }    // root left right    preOrderTraversal(root) {        if (root === null) {            return ;        }        console.log(root.value);        this.preOrderTraversal(root.left);        this.preOrderTraversal(root.right);    }    inOrderTraversal(root) {        // left root right         if (root === null) {            return ;        }        this.inOrderTraversal(root.left);        console.log(root.value);        this.inOrderTraversal(root.right);    }    // left right root    postOrderTraversal(root){         if (root === null) {            return ;        }        this.postOrderTraversal(root.left);        console.log(root.value);        this.postOrderTraversal(root.right)    }    findAppropriatePlace(root, value) {        const side = root.value < value ? 'right' : 'left';        if (side !== '' && root[side] === null) {            return {node : root, side};        }        if(root.value < value) {            //right            return this.findAppropriatePlace(root.right, value);        } else {            //left            return this.findAppropriatePlace(root.left, value);        }    }}const test = new BinaryTree(20);test.insertNode(10);test.insertNode(30);test.insertNode(5);test.insertNode(12);test.insertNode(3);test.insertNode(6);test.insertNode(11);test.insertNode(15);test.insertNode(25);test.insertNode(40);console.log(test);console.log('-------------preOrderTraversal---------');test.preOrderTraversal(test);console.log('-------------inOrderTraversal---------');test.inOrderTraversal(test)console.log('-------------postOrderTraversal---------');test.postOrderTraversal(test)test.removeFromNode(30);console.log(test)/*{    "value": 20,    "left": {        "value": 10,        "left": {            "value": 5,            "left": {                "value": 3,                "left": null,                "right": null            },            "right": {                "value": 6,                "left": null,                "right": null            }        },        "right": {            "value": 12,            "left": {                "value": 11,                "left": null,                "right": null            },            "right": {                "value": 15,                "left": null,                "right": null            }        }    },    "right": {        "value": 30,        "left": {            "value": 25,            "left": null,            "right": null        },        "right": {            "value": 40,            "left": null,            "right": null        }    }}-------------preOrderTraversal---------2010536121115302540-------------inOrderTraversal---------3561011121520253040-------------postOrderTraversal---------3561011121520253040------------------------- **After delete node 30** --------------------BinaryTree {  value: 20,  left: BinaryTree {    value: 10,    left: BinaryTree { value: 5, left: [BinaryTree], right: [BinaryTree] },    right: BinaryTree { value: 12, left: [BinaryTree], right: [BinaryTree] }  },  right: null}*/

以上就是使用 Javascript 实现各种树算法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1490152.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 12:59:07
下一篇 2025年12月19日 12:59:21

相关推荐

  • React vs Vue vs Angular:如何选择正确的框架?

    选择正确的框架对于项目的成功至关重要,因为它会影响性能、可扩展性以及与现有系统集成的难易程度。它还会影响开发速度、对功能要求的遵守以及未来更新和支持的难易程度。 反应 React 是一个用于构建用户界面的开源 JavaScript 库,由 Meta 开发。其主要目标是简化交互式和动态 Web 应用程…

    好文分享 2025年12月19日
    000
  • 简化本地化

    本地化在现代 web 开发中至关重要,但往往很麻烦。管理翻译文件、确保一致性和集成更新可能会变得繁重,尤其是在大型代码库中。传统的 i18n 库需要开发人员手动处理这些复杂性,从而导致效率低下和潜在的错误。 现有 i18n 库的问题 许多现有的 i18n 库要求开发人员: 手动创建和管理 json …

    2025年12月19日
    000
  • 揭开互联网的魔力

    ?开发者们! 有没有想过你如何能够观看那些搞笑的猫视频,查看你的社交媒体,或者一动不动地点一份披萨?这一切背后的魔力就是互联网。今天,我们将一起探索这个迷人的世界,相信我,这将是一次有趣的旅程! 一切是如何开始的 让我们跳进虚拟时间机器,将表盘拨到 1960 年代。一个房间里装满了巨型计算机和一群来…

    2025年12月19日
    000
  • 使用 Formity 在 React 中创建动态、多步骤表单

    构建现代 Web 应用程序时,表单通常成为用户体验的关键部分。无论是收集用户数据、提供多步骤向导还是构建交互式调查,创建动态和响应式表单的挑战很快就会变得难以承受。输入 Formity,这是一个 npm 包,它消除了在 React 中创建表单的痛苦。 什么是形式? Formity 是一个高级表单构建…

    2025年12月19日
    000
  • JS 中的常量以及柏拉图和亚里士多德与它有什么关系

    在我看来,后辈将代码组件视为物质的东西,而前辈则更多地处理理想的类别。或者也许这取决于一个人的世界观而不是他们的专业水平? 有时在代码审查期间,我会遇到代码,其中开发人员使用常量table_width而不是常量car_width,因为这是他找到的第一个具有合适值的常量。 当开发人员根据常量的值而不是…

    2025年12月19日
    000
  • 开始使用 Vercel

    vercel 是一个流行的前端应用程序部署平台。它提供了一个命令行界面 (cli),允许您与 vercel 项目交互并高效部署应用程序。以下是一些常见的 vercel cli 命令及其用途: 安装 使用vercel cli之前,需要安装它。你可以使用 npm 来做到这一点: npm install …

    2025年12月19日
    000
  • JavaScript:默认参数、扩展运算符、剩余参数和解构!

    默认参数 我们可以直接在参数列表中添加默认值 function rolldie(numsides = 6) { return math.floor(math.random() * numsides) + 1;} 这里,需要注意秩序。默认参数只能出现在任何没有默认值的参数之后: function gr…

    2025年12月19日
    000
  • Let、Const 和 Var 概述:主要差异解释

    曾经有一段时间,我使用并理解了 javascript 中 let、const 和 var 的实际用法,但用语言解释它是具有挑战性的。如果您发现自己处于类似的困境,那么需要关注的关键点是范围、提升、重新初始化和重新分配方面的差异。 范围: 如果在任何函数外部声明,则 var 是函数作用域或全局作用域。…

    2025年12月19日
    000
  • 为您的项目选择正确方法的 API 架构终极指南

    在当今互联的数字环境中,api(应用程序编程接口)充当重要的连接器,使不同的软件系统能够无缝通信和共享数据。作为开发人员,选择正确的 api 架构可以决定项目的成败。让我们深入探讨 2024 年主导科技世界的 6 大 api 架构,探索它们的优势、用例以及它们如何提升您的下一个项目。 1. soap…

    2025年12月19日
    000
  • Vue js 通用编码标准

    以下是 vue.js 的其他好的和坏的做法: 通用编码标准 避免魔法数字和字符串:对重复使用或具有特殊含义的值使用常量。 // good const max_items = 10; function additem(item) { if (items.length < max_items) {…

    2025年12月19日
    000
  • 通天“^”,却被加载了“”

    节点 – v14错误:[BABEL] /codebuild/output/src3999571347/src/client/src/index.js:需要 Babel“^7.16.0”,但加载了“7.12.3”。如果您确定您有 @babel/core 的兼容版本,则构建过程中的某些内容可…

    2025年12月19日
    000
  • 面向对象编程 – 现实的抽象

    您好,在这篇看似教程的文章中,我们将讨论一个特别让我头疼的话题。然而,这种困难促使我不断学习、研究、研究,将日常生活的抽象化为自己的抽象,从而将代码变成有形事物的表示(相信我,这有时可能是一项艰巨的任务)。我对这个主题非常热情,现在我在这篇文章中分享了理解它的重要数据,所以让我们进入问题的核心。 我…

    2025年12月19日
    000
  • 如何使用 HMPL 减少客户端上的 javascript 文件大小?

    大家好!在这篇文章中,我想告诉你如何通过 hmpl 这样的模板语言来多次减小 javascript 文件的大小。 文章中出现的技术方法并不新鲜,但今天仍然足够流行,值得讨论。 减小 javascript 文件的大小将使页面在客户端上加载得更快。如果我们采用现代 spa,即使考虑到所有的缩小,文件大小…

    2025年12月19日
    000
  • 自动化云恢复挑战:使用 GitHub Actions 实施 CI/CD

    云简历挑战 – 第 2 部分 介绍 在本系列的第一部分中,我们逐步介绍了如何使用各种 aws 服务构建云原生简历网站。现在,我们将通过使用 github actions 实施持续集成和持续部署 (ci/cd),将我们的项目提升到一个新的水平。这种自动化对于有效维护和更新我们的云简历至关重…

    2025年12月19日
    000
  • 4 年内掌握 Tailwind CSS 与流行 JavaScript 框架的集成

    您准备好增强您的 web 开发工作流程了吗?别再犹豫了!在这份综合指南中,我们将引导您完成将 tailwind css 与四个最热门的 javascript 框架无缝集成的过程:react、angular、next.js 和 nuxt.js。无论您是经验丰富的专业人士还是刚刚起步,本教程都将帮助您立…

    2025年12月19日 好文分享
    000
  • JavaScript 中的二叉搜索树

    在 javascript 中实现二叉搜索树 在这篇文章中,我们将探索如何在 javascript 中实现基本的二叉搜索树 (bst)。我们将介绍插入节点和执行不同的树遍历方法 – 中序、前序和后序。 节点类首先,我们定义一个 node 类来表示树中的每个节点: class node { …

    2025年12月19日
    000
  • 如何在 React 中创建可访问的图表:包容性数据可视化指南

    什么是数据可视化中的可访问性 数据可视化是沟通的关键,但残疾人可能无法使用。数据可视化的可访问性对于确保所有用户(无论能力如何)都能理解图表并与图表交互至关重要。 highcharts 拥有创建可访问图表的工具和功能,依赖屏幕阅读器的用户将受益于正确的标签和注释。 选择正确的图表类型 不同的图表类型…

    2025年12月19日
    000
  • Arrayslice 与 Arraysplice:消除混淆

    介绍 作为一名 javascript 开发人员,我经常发现两个数组方法有点难以掌握/完全掌握 数组.切片 数组.splice。 因此,我决定深入研究并用清晰的示例来分解这些方法。 如果我重写语法 数组.切片 returns the deleted elements in a form of arra…

    2025年12月19日
    000
  • 使用 InversifyJS 在 Nodejs 中实现依赖注入

    嘿,开发者社区! 我刚刚在我的博客上发表了一篇关于如何使用 inversifyjs 在 node.js 中实现依赖注入的详细文章。如果您希望使 node.js 应用程序更加模块化、可维护和可测试,那么本指南适合您! 在本文中,我介绍: 什么是依赖注入以及为什么它很重要。如何在 node.js 项目中…

    2025年12月19日
    000
  • 使用 AWS Bedrock 将 GenAI 添加到 Angular 应用程序

    将人工智能集成到 web 应用程序中已经变得越来越普遍。 aws bedrock 提供了一个强大的平台来访问和利用基础模型 (fm) 来构建生成式 ai 应用程序。本文将指导您使用 aws bedrock 将 ai 功能集成到 angular 应用程序中。 先决条件 对 angular 和 type…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信