树结构详细介绍(javascript版)

树结构的基本概念

树是一种非线性数据结构,由节点和连接节点的边组成。与线性数据结构(如数组、链表)不同,树具有层次结构,非常适合表示有层次关系的数据。

树的基本术语

  • 节点 (Node): 树中的基本单元,包含数据和指向其他节点的引用
  • 根节点 (Root): 树的顶部节点,没有父节点
  • 子节点 (Child): 一个节点的直接下级节点
  • 父节点 (Parent): 一个节点的直接上级节点
  • 叶节点 (Leaf): 没有子节点的节点
  • 路径 (Path): 连接一个节点到另一个节点的节点序列
  • 高度 (Height): 从叶节点到该节点的最长路径上的节点数
  • 深度 (Depth): 从根节点到该节点的边数

JavaScript 实现基本树结构

下面是一个使用 JavaScript 实现的基本树结构:

class TreeNode {constructor(value) {this.value = value;this.children = [];}// 添加子节点addChild(childNode) {this.children.push(childNode);return this;}// 移除子节点removeChild(childNode) {const index = this.children.indexOf(childNode);if (index !== -1) {this.children.splice(index, 1);}return this;}// 深度优先遍历depthFirstTraversal() {const result = [];    function traverse(node) {result.push(node.value);node.children.forEach(child => traverse(child));}    traverse(this);return result;}// 广度优先遍历breadthFirstTraversal() {const result = [];const queue = [this];while (queue.length > 0) {const currentNode = queue.shift();result.push(currentNode.value);currentNode.children.forEach(child => queue.push(child));}    return result;}
}// 使用示例
const root = new TreeNode(1);
const child1 = new TreeNode(2);
const child2 = new TreeNode(3);
const grandChild1 = new TreeNode(4);
const grandChild2 = new TreeNode(5);child1.addChild(grandChild1);
child2.addChild(grandChild2);
root.addChild(child1).addChild(child2);console.log("深度优先遍历:", root.depthFirstTraversal()); // [1, 2, 4, 3, 5]
console.log("广度优先遍历:", root.breadthFirstTraversal()); // [1, 2, 3, 4, 5]

树的常见类型

  • 二叉树 (Binary Tree)
    二叉树是一种特殊的树,每个节点最多有两个子节点,通常称为左子节点和右子节点。

    class BinaryTreeNode {constructor(value) {this.value = value;this.left = null;this.right = null;}
    }class BinaryTree {constructor() {this.root = null;}	// 插入节点insert(value) {const newNode = new BinaryTreeNode(value);	    if (!this.root) {this.root = newNode;return this;}	    let current = this.root;while (true) {if (value === current.value) return undefined;	      if (value < current.value) {if (!current.left) {current.left = newNode;return this;}current = current.left;} else {if (!current.right) {current.right = newNode;return this;}current = current.right;}}}// 查找节点find(value) {if (!this.root) return false;	    let current = this.root;let found = false;	    while (current && !found) {if (value < current.value) {current = current.left;} else if (value > current.value) {current = current.right;} else {found = true;}}	    return found ? current : false;}// 前序遍历 (根 -> 左 -> 右)preOrderTraversal() {const result = [];	    function traverse(node) {result.push(node.value);if (node.left) traverse(node.left);if (node.right) traverse(node.right);}	    traverse(this.root);return result;}	// 中序遍历 (左 -> 根 -> 右)inOrderTraversal() {const result = [];	    function traverse(node) {if (node.left) traverse(node.left);result.push(node.value);if (node.right) traverse(node.right);}	    traverse(this.root);return result;}	// 后序遍历 (左 -> 右 -> 根)postOrderTraversal() {const result = [];	    function traverse(node) {if (node.left) traverse(node.left);if (node.right) traverse(node.right);result.push(node.value);}	    traverse(this.root);return result;}
    }	
    // 使用示例
    const binaryTree = new BinaryTree();
    binaryTree.insert(10);
    binaryTree.insert(6);
    binaryTree.insert(15);
    binaryTree.insert(3);
    binaryTree.insert(8);
    binaryTree.insert(20);
    console.log("前序遍历:", binaryTree.preOrderTraversal()); // [10, 6, 3, 8, 15, 20]
    console.log("中序遍历:", binaryTree.inOrderTraversal()); // [3, 6, 8, 10, 15, 20]
    console.log("后序遍历:", binaryTree.postOrderTraversal()); // [3, 8, 6, 20, 15, 10]

二叉搜索树 (Binary Search Tree, BST)

二叉搜索树是一种特殊的二叉树,对于树中的每个节点:

  • 左子树中所有节点的值都小于该节点的值

  • 右子树中所有节点的值都大于该节点的值

  • 左右子树也分别是二叉搜索树

    上面的二叉树实现实际上就是一个二叉搜索树的实现,它提供了高效的查找、插入和删除操作,时间复杂度为 O (log n)。

平衡二叉树 (AVL Tree)

平衡二叉树是一种特殊的二叉搜索树,它的每个节点的左右子树的高度差不超过 1。这种平衡特性保证了树的高度始终保持在 O (log n),从而保证了所有操作的时间复杂度都是 O (log n)。

红黑树 (Red-Black Tree)

红黑树是一种自平衡的二叉搜索树,它通过为每个节点分配一个颜色(红色或黑色)并遵循一些特定的规则来保持树的平衡。红黑树的平衡性不如 AVL 树严格,但它的插入和删除操作更快。

树的遍历方法

树的遍历是指按照某种顺序访问树中的所有节点。主要有两种遍历方式:

  • 深度优先遍历 (DFS)
    深度优先遍历沿着树的深度遍历树的节点,尽可能深的搜索树的分支。主要有三种实现方式:

    • 前序遍历 (Pre-order): 根节点 -> 左子树 -> 右子树
    • 中序遍历 (In-order): 左子树 -> 根节点 -> 右子树
    • 后序遍历 (Post-order): 左子树 -> 右子树 -> 根节点
  • 广度优先遍历 (BFS)
    广度优先遍历按照层次依次访问树中的节点,从上到下,从左到右。

树结构的应用

树结构在计算机科学和现实生活中有广泛的应用:

  • 文件系统: 文件和文件夹的层次结构
  • 数据库索引: B 树和 B + 树用于提高数据库查询效率
  • 搜索引擎: 网页的层次结构和索引
  • XML 和 JSON 解析: 解析和处理层次化的数据
  • 编译器: 语法树的构建和分析
  • 游戏 AI: 决策树和博弈树
  • 网络路由算法: 最短路径树

树是一种非常重要且灵活的数据结构,掌握树的概念和实现对于理解和解决许多计算机科学问题至关重要。

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

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

相关文章

element-plus bug整理

1.el-table嵌入el-image标签预览时&#xff0c;显示错乱 解决&#xff1a;添加preview-teleported属性 <el-table-column label"等级图标" align"center" prop"icon" min-width"80"><template #default"scope"&g…

RabbitMQ和MQTT区别与应用

RabbitMQ与MQTT深度解析&#xff1a;协议、代理、差异与应用场景 I. 引言 消息队列与物联网通信的重要性 在现代分布式系统和物联网&#xff08;IoT&#xff09;生态中&#xff0c;高效、可靠的通信机制是构建稳健、可扩展应用的核心。消息队列&#xff08;Message Queues&am…

零基础远程连接课题组Linux服务器,安装anaconda,配置python环境(换源),在服务器上运行python代码【3/3 适合小白,步骤详细!!!】

远程连接服务器 请查阅之前的博客——零基础远程连接课题组Linux服务器&#xff0c;安装anaconda&#xff0c;配置python环境&#xff08;换源&#xff09;&#xff0c;在服务器上运行python代码【1/3 适合小白&#xff0c;步骤详细&#xff01;&#xff01;&#xff01;】&am…

Redis最佳实践——安全与稳定性保障之访问控制详解

Redis 在电商应用的安全与稳定性保障之访问控制全面详解 一、安全访问控制体系架构 1. 多层级防护体系 #mermaid-svg-jpkDj2nKxCq9AXIW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-jpkDj2nKxCq9AXIW .error-ico…

vue2源码解析——响应式原理

文章目录 引言数据劫持收集依赖数组处理渲染watchervue3中的响应式 引言 vue的设计思想是数据双向绑定、数据与UI自动同步&#xff0c;即数据驱动视图。 为什么会这样呢&#xff1f;这就不得不提vue的响应式原理了&#xff0c;在使用vue的过程中&#xff0c;我被vue的响应式设…

gcc相关内容

gcc 介绍&#xff1a;linux就是由gcc编译出来的&#xff0c;而且好像之前Linux只支持gcc编译。gcc全称为gnu compiler collection&#xff0c;它是gnu项目的一个组成部分。gnu致力于创建一个完全自由的操作系统&#xff0c;我感觉意思就是完全开源的操作系统。gnu有很多组件和…

android 图片背景毛玻璃效果实现

图片背景毛玻璃效果实现 1 依赖 // Glide implementation("com.github.bumptech.glide:glide:4.16.0") kapt("com.github.bumptech.glide:compiler:4.16.0") implementation("jp.wasabeef:glide-transformations:4.3.0") 2 布局<com.googl…

【Java开发日记】你会不会5种牛犇的yml文件读取方式?

前言 除了烂大街的Value和ConfigurationProperties外&#xff0c;还能够通过哪些方式&#xff0c;来读取yml配置文件的内容&#xff1f; 1、Environment 在Spring中有一个类Environment&#xff0c;它可以被认为是当前应用程序正在运行的环境&#xff0c;它继承了PropertyReso…

Spring Boot事务失效场景及解决方案

事务失效场景1&#xff1a;方法非public修饰 原因 Spring事务基于动态代理&#xff08;AOP&#xff09;实现&#xff0c;非public方法无法被代理拦截&#xff0c;导致事务失效。 代码示例 Service public class OrderService {Transactionalprivate void createOrder() { //…

电子电路:怎么理解时钟脉冲上升沿这句话?

时钟脉冲是数字电路中用于同步各组件操作的周期性信号&#xff0c;通常表现为高低电平交替的方波。理解其关键点如下&#xff1a; 时钟脉冲的本质&#xff1a; 由晶振等元件生成&#xff0c;呈现0/1&#xff08;低/高电平&#xff09;的规律振荡每个周期包含上升沿→高电平→下…

docker部署redis mysql nacos seata rabbitmq minio onlyoffice nginx实战

docker部署redis mysql nacos seata rabbitmq minio onlyoffice nginx实战 一、环境介绍 操作系统&#xff1a;ubuntu22.04 软件环境&#xff1a;docker、docker-compose 二、docker安装 版本规定到26.1.3版本过低会引起莫名其妙的问题。打开终端。更新软件包列表&#x…

全面解析:npm 命令、package.json 结构与 Vite 详解

全面解析&#xff1a;npm 命令、package.json 结构与 Vite 详解 一、npm run dev 和 npm run build 命令解析 1. npm run dev 作用&#xff1a;启动开发服务器&#xff0c;用于本地开发原理&#xff1a; 启动 Vite 开发服务器提供实时热更新&#xff08;HMR&#xff09;功能…

【Oracle】TCL语言

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. TCL概述1.1 什么是TCL&#xff1f;1.2 TCL的核心功能 2. 事务基础概念2.1 事务的ACID特性2.2 事务的生命周期 3. COMMIT语句详解3.1 COMMIT基础语法3.2 自动提交与手动提交3.3 提交性能优化 4. ROLLBACK语句…

OpenCV CUDA模块直方图计算------用于在 GPU 上执行对比度受限的自适应直方图均衡类cv::cuda::CLAHE

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::CLAHE 是 OpenCV 的 CUDA 模块中提供的一个类&#xff0c;用于在 GPU 上执行对比度受限的自适应直方图均衡&#xff08;Contrast Limi…

OpenGAN:基于开放数据生成的开放集识别

简介 简介&#xff1a;这次学习的OpenGAN主要学习一个思路&#xff0c;跳出传统GAN对于判断真假的识别到判断是已知种类还是未知种类。重点内容不在于代码而是思路&#xff0c;会简要给出一个设计的代码。 论文题目&#xff1a;OpenGAN: Open-Set Recognition via Open Data …

随机游动算法解决kSAT问题

input&#xff1a;n个变量的k-CNF公式 ouput&#xff1a;该公式的一组满足赋值或宣布没有满足赋值 算法步骤&#xff1a; 随机均匀地初始化赋值 a ∈ { 0 , 1 } n a\in\{0,1\}^n a∈{0,1}n.重复t次&#xff08;后面会估计这个t&#xff09;&#xff1a; a. 如果在当前赋值下…

企业上线ESOP电子作业指导书系统实现车间无纸化的投入收益数据综合分析

企业上线ESOP电子作业指导书系统实现车间无纸化的投入收益数据综合分析 一、成本节约&#xff1a;无纸化直接降低运营成本 纸张与耗材费用锐减 o 杭州科创致远案例&#xff1a;某汽配企业引入无纸化系统后&#xff0c;年节省纸张耗材费用超50万元。通过电子化替代传统纸质文档…

高并发抽奖系统优化方案

引子 最近接触了一个抽奖的项目&#xff0c;由于用户量比较大&#xff0c;而且第三方提供的认证接口并发量有限&#xff0c;为了保证服务的高可用性&#xff0c;所以对高并限制发有一定的要求。经过一系列研究和讨论&#xff0c;做出了以下一些优化方案。 需求分析 根据用户量…

STM32八股【10】-----stm32启动流程

启动流程 1.上电复位 2.系统初始化 3.跳转到 main 函数 启动入口&#xff1a; cpu被清空&#xff0c;程序从0x00000000开始运行0x00000000存放的是reset_handler的入口地址0x00000000的实际位置会变&#xff0c;根据不同的启动模式决定启动模式分为&#xff1a; flash启动&a…

LLMTIME: 不用微调!如何用大模型玩转时间序列预测?

今天是端午节&#xff0c;端午安康&#xff01;值此传统佳节之际&#xff0c;我想和大家分享一篇关于基于大语言模型的时序预测算法——LLMTIME。随着人工智能技术的飞速发展&#xff0c;利用大型预训练语言模型&#xff08;LLM&#xff09;进行时间序列预测成为一个新兴且极具…