樹結構詳細介紹(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
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83134.shtml
英文地址,請注明出處:http://en.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;進行時間序列預測成為一個新興且極具…