精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

前端: JavaScript 中的二叉樹算法實現

開發 前端 算法
接下來讓我們一起來探討js數據結構中的樹。這里的樹類比現實生活中的樹,有樹干,樹枝,在程序中樹是一種數據結構,對于存儲需要快速查找的數據非有用,它是一種分層數據的抽象模型。一個樹結構包含一系列存在父子關系的節點。每個節點都有一個父節點以及零個或多個子節點。

[[359197]]

接下來讓我們一起來探討js數據結構中的樹。這里的樹類比現實生活中的樹,有樹干,樹枝,在程序中樹是一種數據結構,對于存儲需要快速查找的數據非有用,它是一種分層數據的抽象模型。一個樹結構包含一系列存在父子關系的節點。每個節點都有一個父節點以及零個或多個子節點。如下所以為一個樹結構:)


  • 和樹相關的概念:1.子樹:由節點和他的后代構成,如上圖標示處。2.深度:節點的深度取決于它祖節點的數量,比如節點5有2個祖節點,他的深度為2。3.高度:樹的高度取決于所有節點深度的最大值。

二叉樹和二叉搜索樹介紹

二叉樹中的節點最多只能有2個子節點,一個是左側子節點,一個是右側子節點,這樣定義的好處是有利于我們寫出更高效的插入,查找,刪除節點的算法。二叉搜索樹是二叉樹的一種,但是它只允許你在左側子節點存儲比父節點小的值,但在右側節點存儲比父節點大的值。接下來我們將按照這個思路去實現一個二叉搜索樹。

1. 創建BinarySearchTree類

這里我們將使用構造函數去創建一個類:

  1. function BinarySearchTree(){ 
  2.     // 用于創建節點的類 
  3.     let Node = function(key) { 
  4.         this.key = key
  5.         this.left = null
  6.         this.right = null
  7.     } 
  8.     // 根節點 
  9.     let root = null

我們將使用和鏈表類似的指針方式去表示節點之間的關系,如果不了解鏈表,請看我后序的文章《如何實現單向鏈表和雙向鏈表》。

2.插入一個鍵

  1. // 插入一個鍵 
  2. this.insert = function(key) { 
  3.     let newNode = new Node(key); 
  4.     root === null ? (root = newNode) : (insertNode(root, newNode)) 

向樹中插入一個新的節點主要有以下三部分:1.創建新節點的Node類實例 --> 2.判斷插入操作是否為根節點,是根節點就將其指向根節點 --> 3.將節點加入非根節點的其他位置。

insertNode的具體實現如下:

  1. function insertNode(node, newNode){ 
  2.     if(newNode.key < node.key) { 
  3.         node.left === null ? (node.left = newNode) : (insertNode(node.left, newNode)) 
  4.     }else { 
  5.         node.right === null ? (node.right = newNode) : (insertNode(node.right, newNode)) 
  6.     } 

這里我們用到遞歸,接下來要實現的search,del等都會大量使用遞歸,所以說不了解的可以先自行學習了解。我們創建一個二叉樹實例,來插入一個鍵:

  1. let tree = new BinarySearchTree(); 
  2. tree.insert(20); 
  3. tree.insert(21); 
  4. tree.insert(520); 
  5. tree.insert(521); 

插入的結構會按照二叉搜索樹的規則去插入,結構類似于上文的第一個樹圖。

樹的遍歷

訪問樹的所有節點有三種遍歷方式:中序,先序和后序。

  • 中序遍歷:以從最小到最大的順序訪問所有節點
  • 先序遍歷:以優先于后代節點的順序訪問每個節點
  • 后序遍歷:先訪問節點的后代節點再訪問節點本身

根據以上的介紹,我們可以有以下的實現代碼。

1 中序排序

  1. this.inOrderTraverse = function(cb){ 
  2.     inOrderTraverseNode(root, cb); 
  3.  
  4. // 輔助函數 
  5. function inOrderTraverseNode(node, cb){ 
  6.     if(node !== null){ 
  7.         inOrderTraverseNode(node.left, cb); 
  8.         cb(node.key); 
  9.         inOrderTraverseNode(node.right, cb); 
  10.     } 

使用中序遍歷可以實現對樹進行從小到大排序的功能。

2 先序排序

  1. // 先序排序 --- 優先于后代節點的順序訪問每個節點 
  2.    this.preOrderTraverse = function(cb) { 
  3.      preOrderTraverseNode(root, cb); 
  4.    } 
  5.  
  6.    // 先序排序輔助方法 
  7.    function preOrderTraverseNode(node, cb) { 
  8.      if(node !== null) { 
  9.        cb(node.key); 
  10.        preOrderTraverseNode(node.left, cb); 
  11.        preOrderTraverseNode(node.right, cb); 
  12.      } 
  13.    } 

使用先序排序可以實現結構化輸出的功能。

3 后序排序

  1. // 后續遍歷 --- 先訪問后代節點,再訪問節點本身 
  2.    this.postOrderTraverse = function(cb) { 
  3.      postOrderTraverseNode(root, cb); 
  4.    } 
  5.  
  6.    // 后續遍歷輔助方法 
  7.    function postOrderTraverseNode(node, cb) { 
  8.      if(node !== null){ 
  9.        postOrderTraverseNode(node.left, cb); 
  10.        postOrderTraverseNode(node.right, cb); 
  11.        cb(node.key); 
  12.      } 
  13.    } 

后序遍歷可以用于計算有層級關系的所有元素的大小。

搜索樹中的值

在樹中有三種經常執行的搜索類型:最大值,最小值,特定的值。

1 最小值

最小值通過定義可以知道即是左側樹的最底端的節點,具體實現代碼如下:

  1. // 最小值 
  2.    this.min = function(){ 
  3.      return minNode(root) 
  4.    } 
  5.  
  6.     function minNode(node) { 
  7.      if(node) { 
  8.        while(node && node.left !== null){ 
  9.          node = node.left
  10.        } 
  11.        return node.key 
  12.      } 
  13.      return null 
  14.    } 

相似的,實現最大值的方法如下:

  1. // 最大值 
  2.    this.max = function() { 
  3.      return maxNode(root) 
  4.    } 
  5.  
  6.    function maxNode(node) { 
  7.      if(node){ 
  8.        while(node && node.right !== null){ 
  9.          node = node.right
  10.        } 
  11.        return node.key 
  12.      } 
  13.      return null 
  14.    } 

2.搜索一個特定的值

  1. // 搜索樹中某個值 
  2. this.search = function(key) { 
  3.     return searchNode(root, key
  4.  
  5. // 搜索輔助方法 
  6. function searchNode(node, key){ 
  7.     if(node === null) { 
  8.         return false 
  9.     } 
  10.     if(key < node.key) { 
  11.         return searchNode(node.leftkey
  12.     } else if(key > node.key) { 
  13.         return searchNode(node.rightkey
  14.     }else { 
  15.         return true 
  16.     } 

3 移除一個節點

  1. this.remove = function(key){ 
  2.     root = removeNode(root, key); 
  3.  
  4. // 發現最小節點 
  5. function findMinNode(node) { 
  6.     if(node) { 
  7.     while(node && node.left !== null){ 
  8.         node = node.left
  9.     } 
  10.     return node 
  11.     } 
  12.     return null 
  13.  
  14. // 移除節點輔助方法 
  15. function removeNode(node, key) { 
  16.     if(node === null) { 
  17.     return null 
  18.     } 
  19.  
  20.     if(key < node.key){ 
  21.     node.left = removeNode(node.leftkey); 
  22.     return node 
  23.     } else if( key > node.key){ 
  24.     node.right = removeNode(node.rightkey); 
  25.     return node 
  26.     } else { 
  27.     // 一個頁節點 
  28.     if(node.left === null && node.right === null) { 
  29.         node = null
  30.         return node 
  31.     } 
  32.  
  33.     // 只有一個子節點的節點 
  34.     if(node.left === null) { 
  35.         node = node.right
  36.         return node 
  37.     }else if(node.right === null) { 
  38.         node = node.left
  39.         return node 
  40.     } 
  41.  
  42.     // 有兩個子節點的節點 
  43.     let aux = findMinNode(node.right); 
  44.     node.key = aux.key
  45.     node.right = removeNode(node.right, aux.key); 
  46.     return node 
  47.     } 

刪除節點需要考慮的情況比較多,這里我們會使用和min類似的實現去寫一個發現最小節點的函數,當要刪除的節點有兩個子節點時,我們要將當前要刪除的節點替換為子節點中最大的一個節點的值,然后將這個子節點刪除。

至此,一個二叉搜索樹已經實現,但是還存在一個問題,如果樹的一遍非常深,將會存在一定的性能問題,為了解決這個問題,我們可以利用AVL樹,一種自平衡二叉樹,也就是說任何一個節點的左右兩側子樹的高度之差最多為1。

 

責任編輯:姜華 來源: 趣談前端
相關推薦

2020-04-27 07:05:58

二叉樹左子樹右子樹

2013-07-15 16:35:55

二叉樹迭代器

2021-09-29 10:19:00

算法平衡二叉樹

2020-09-23 18:25:40

算法二叉樹多叉樹

2021-04-20 08:37:14

數據結構二叉樹

2009-08-11 13:29:57

C#二叉樹遍歷

2021-09-15 07:56:32

二叉樹層次遍歷

2021-09-28 06:28:51

二叉樹公共祖先

2021-04-19 07:47:42

數據結構二叉樹Tree

2021-04-28 20:12:27

數據結構創建

2020-12-30 08:35:34

貪心算法監控

2022-10-26 23:58:02

二叉樹數組算法

2021-08-27 11:36:44

二叉樹回溯節點

2021-03-17 08:19:22

二叉樹LeetCode

2020-11-02 09:15:47

算法與數據結構

2018-03-15 08:31:57

二叉樹存儲結構

2021-10-12 09:25:11

二叉樹樹形結構

2021-05-06 17:46:30

二叉樹數據結構

2023-05-08 15:57:16

二叉樹數據結構

2021-03-22 08:23:29

LeetCode二叉樹節點
點贊
收藏

51CTO技術棧公眾號

国产精品二线| 黄色aaa视频| 国产视频在线播放| 丁香桃色午夜亚洲一区二区三区| 欧美一级精品在线| 欧美黄网在线观看| 丰满少妇一级片| 久久aⅴ乱码一区二区三区| 在线日韩精品视频| 午夜免费视频网站| 欧美二三四区| 一区二区在线观看视频在线观看| 国产精品精品视频| 亚洲色图综合区| 丝袜连裤袜欧美激情日韩| 亚洲免费伊人电影| 欧美精品欧美精品系列c| 男女猛烈激情xx00免费视频| 手机免费看av片| 素人啪啪色综合| 亚洲一区免费视频| 91精品免费视频| 国产又粗又长免费视频| 久久这里只有精品一区二区| 欧美日韩小视频| 欧美日韩dvd| 精品久久人妻av中文字幕| 91精品观看| 亚洲欧洲在线视频| 国产伦精品一区二区三区精品| 青草av在线| 国产精品女上位| 欧美成人免费在线| 男人天堂综合网| 国产一区二区三区在线看麻豆| 中文字幕久热精品在线视频| 国产又大又黄又猛| 在线观看网站免费入口在线观看国内| 99re热视频这里只精品| 国产精品免费久久| 久久久亚洲成人| 亚洲小说欧美另类激情| 神马久久精品综合| 精品99久久| 亚洲高清久久久久久| 天天做天天干天天操| 日本一道高清亚洲日美韩| 岛国av在线不卡| 精品国产综合区久久久久久| 国产成人a人亚洲精品无码| 欧美一区精品| 蜜臀久久99精品久久久无需会员| 肉丝美足丝袜一区二区三区四| 日韩理论视频| 狠狠爱在线视频一区| 你真棒插曲来救救我在线观看| 韩日视频在线| 久久久一区二区三区捆绑**| 久久青青草综合| 色视频精品视频在线观看| 少妇久久久久久久| 欧美极品少妇videossex| 国产欧美高清| 97视频在线观看成人| 久久精品www人人爽人人| 欧美激情1区2区3区| 久久伊人91精品综合网站| 内射一区二区三区| 牛牛国产精品| 久久久久成人网| 国产精品9191| 久久久久91| 国产精品99久久久久久久久久久久 | 国产亚洲1区2区3区| 欧美日韩高清免费| 国产精品视频一区二区久久| 国产91精品久久久久久久网曝门| 国产91精品最新在线播放| 久久久久久久久黄色| 精品视频一区二区在线观看| 亚洲春色在线视频| 免费资源在线观看| 中文欧美字幕免费| 好吊色这里只有精品| 人人超在线公开视频| 欧美日韩国产精品一区二区不卡中文 | 国产免费裸体视频| 久久不射影院| 色婷婷精品大视频在线蜜桃视频| 99久久99久久精品| 擼擼色在线看观看免费| 欧美亚洲国产一区二区三区| 久久久久久久高清| 加勒比色老久久爱综合网| 欧美一区二区三区在线视频 | 精品一区二区三区免费毛片爱 | 992tv国产精品成人影院| 久久在线观看| 亚洲免费观看高清完整版在线观看熊 | 久久精品久久国产| 久久欧美肥婆一二区| av黄色免费在线观看| 忘忧草精品久久久久久久高清| 日韩欧美第一区| 艹b视频在线观看| 警花av一区二区三区| 日韩国产精品一区| 朝桐光av在线| 日韩精品一级中文字幕精品视频免费观看| 欧美劲爆第一页| 久久久久久久中文字幕| 每日更新成人在线视频| 91亚洲精品一区二区| 欧美少妇另类| 久久亚洲精精品中文字幕早川悠里| 99国内精品久久久久久久软件| 一二三区在线播放| 女人18毛片毛片毛片毛片区二 | 久久夜色精品国产噜噜av小说| 午夜欧美一区二区三区在线播放| 蜜臀在线免费观看| 美脚恋feet久草欧美| 日韩欧美国产高清| 国产黄色片在线| 男人天堂欧美日韩| 国产一区二区视频在线免费观看| 人妻偷人精品一区二区三区| 国产欧美日韩在线| 日韩国产在线一区| 快射av在线播放一区| 日本韩国一区二区| 亚洲av永久无码精品| 一区二区免费不卡在线| 国产精品日韩在线| 精品欧美不卡一区二区在线观看| 欧美激情在线一区二区| 波多野结衣三级在线| 欧美色网在线| 99在线精品观看| 欧美日韩性视频在线| 一本久道中文无码字幕av| 91精品丝袜国产高跟在线| 久久久精品一区二区三区| 中文字幕一区二区人妻| 国产伦精品一区二区三区免费迷 | 一本色道久久综合亚洲精品小说| 99热6这里只有精品| 美女久久网站| 日韩电影免费观看在| 欧美男体视频| 亚洲日本中文字幕| 黄色片视频免费| 91色porny蝌蚪| 日本人69视频| 国产精品乱码久久久| 国产成人精品免费一区二区| 中文字幕在线中文字幕日亚韩一区| 午夜精品中文字幕| 蜜臀av粉嫩av懂色av| 久久久久久久性潮| 91精品国产全国免费观看| 欧美激情 亚洲| 国际av在线| 国产91丝袜在线18| 成人欧美一区二区三区视频 | 全部免费毛片在线播放网站| 亚洲中国最大av网站| 久久久久无码国产精品一区李宗瑞| 黄色一级视频免费| 美女诱惑一区二区| 亚洲第一精品区| 丰满诱人av在线播放| 91久久一区二区| 国产午夜福利一区| 国产一区二区三区蝌蚪| av日韩在线看| 久久夜色精品国产噜噜av小说| 在线免费观看羞羞视频一区二区| 91av在线免费视频| 韩国精品视频在线观看| 中文字幕五月欧美| 亚洲国产精品久久久久婷蜜芽| 日韩欧美另类中文字幕| 国内精品免费午夜毛片| 九九九伊在人线综合| 欧美日本精品一区二区三区| 中国美女乱淫免费看视频| 日本少妇一区二区| 国产伦精品一区二区三区视频黑人| 瑟瑟视频在线| 精品乱人伦小说| 天干夜夜爽爽日日日日| av综合在线播放| 蜜臀av免费观看| 很黄很黄激情成人| 成人在线视频福利| а√天堂8资源在线| 一二美女精品欧洲| 国产刺激高潮av| 欧美色综合久久| 国产无遮无挡120秒| 国产亚洲美州欧州综合国| 国内av免费观看| 欧美专区一区二区三区| 欧美xxxx吸乳| 九一国产精品| 国产高清精品一区二区| 国语对白做受xxxxx在线中国| 在线中文免费视频| 亚洲精品视频在线播放| 国产精品永久久久久久久久久| 亚洲欧美综合另类在线卡通| 精品久久久久一区二区| 久久99精品国产麻豆婷婷| 黄色免费福利视频| 综合在线一区| 亚洲欧美国产一区二区| 色天下一区二区三区| 51国产成人精品午夜福中文下载| 免费网站看v片在线a| 欧美午夜视频网站| 欧美日韩黄色网| 国产欧美一区二区精品久导航| 在线观看日本一区二区| 中文字幕日韩一区二区不卡| 欧美一区二区福利| 狼人天天伊人久久| 99在线视频首页| 久久99成人| 97人人爽人人喊人人模波多 | av中文字幕电影在线看| 久久韩剧网电视剧| 免费av网站在线观看| 国产亚洲精品美女久久久| 狠狠色噜噜狠狠色综合久| 污污在线观看| 久久天天躁夜夜躁狠狠躁2022| 国产欧美日韩成人| 欧美日韩一区二区三区在线看| 国产一区二区精彩视频| 国产精品国产三级国产普通话99 | 国产精品日日夜夜| 亚洲视频在线一区观看| 蜜桃av免费观看| 粉嫩绯色av一区二区在线观看| 国产精品宾馆在线精品酒店| 91久久夜色精品国产九色| 国产 欧美 日本| 国内自拍一区| 欧美国产日韩激情| 欧美成人自拍| 亚洲精品在线观看免费| 日本久久黄色| 亚洲最大色综合成人av| 久久久久久久久久久9不雅视频 | 国产91九色视频| 午夜影院免费在线| 九九热最新视频//这里只有精品| 日韩av片在线看| 香蕉久久精品日日躁夜夜躁| 亚洲free性xxxx护士hd| 国产美女视频一区二区| 97av在线播放| 亚洲www.| 国产日韩视频在线观看| 亚洲国产欧美日本视频| 国产第一区电影| 伦一区二区三区中文字幕v亚洲| 8x拔播拔播x8国产精品| 二区三区不卡| 国产精品吴梦梦| 老司机深夜福利在线观看| 神马久久久久久| 欧美日韩伦理片| 亚洲国产成人av在线| 色播色播色播色播色播在线| 国产一区二区三区在线看| 日本中文字幕在线播放| 欧美日本啪啪无遮挡网站| 国产免费拔擦拔擦8x在线播放| 欧美大荫蒂xxx| av资源亚洲| 92裸体在线视频网站| 久久365资源| 色婷婷精品国产一区二区三区| 任我爽精品视频在线播放| 日本日本精品二区免费| 免费日韩一区二区三区| 日韩av电影免费在线观看| 一级特黄aaa大片在线观看| 国产精品一级在线| 91国产精品视频在线观看| 狠狠色狠狠色综合| 亚洲高清在线免费观看| 国产精品原创巨作av| 精品中文字幕在线播放| 国产精品免费丝袜| 国产午夜小视频| 欧美日韩国产综合久久| 天堂av中文字幕| 久久人人爽亚洲精品天堂| 韩国成人二区| 成人h猎奇视频网站| 日韩一级特黄| 久久久久久久久一区| 亚洲成人一区| 黄色成人免费看| 99在线精品视频| 极品颜值美女露脸啪啪| 在线看日本不卡| 特黄视频在线观看| 永久免费看mv网站入口亚洲| 国产夫妻在线播放| 95av在线视频| 日韩av在线播放网址| 国产l精品国产亚洲区久久| 国产另类ts人妖一区二区| 日韩影视一区二区三区| 精品久久中文字幕久久av| 国产v片在线观看| 中文字幕精品久久| 卡通欧美亚洲| 久久精品aaaaaa毛片| 不卡视频观看| 色域天天综合网| 亚洲精品97久久中文字幕| 色av吧综合网| 91国内外精品自在线播放| 久草热久草热线频97精品| 国产精品观看| 9191在线视频| 亚洲欧美一区二区三区国产精品 | 香蕉视频免费看| 久久99久久99精品中文字幕 | 婷婷一区二区三区| 国产激情视频在线播放| 久久亚洲电影天堂| 麻豆久久久久| 成年人黄色在线观看| 美日韩一区二区| 少妇高潮在线观看| 欧美乱熟臀69xxxxxx| 91免费在线| 国产狼人综合免费视频| 日韩精品二区| 天天色天天综合网| 综合久久给合久久狠狠狠97色| 国产情侣在线视频| 欧美日韩mp4| 香蕉视频网站在线观看| 91精品国产99久久久久久| 国产成人av毛片| 97视频久久久| 99久久久久久99| 国产午夜麻豆影院在线观看| 亚洲久久久久久久久久| 亚洲成人网在线播放| 国产亚洲午夜高清国产拍精品| 制服丨自拍丨欧美丨动漫丨| 欧美午夜理伦三级在线观看| 国产精品ⅴa有声小说| 国产精品视频自在线| 亚洲xxx拳头交| 99国产精品免费视频| 亚洲成人免费av| 色视频在线观看免费| 欧美成人午夜剧场免费观看| 视频二区欧美毛片免费观看| 2018日日夜夜| 久久精品人人做人人爽人人| 欧美高清69hd| 久久999免费视频| 午夜先锋成人动漫在线| 亚洲黄色av网址| 亚洲精品中文在线| 在线免费观看日韩视频| 精品视频一区在线视频| 最新日韩一区| 国产欧美123| 国产精品白丝jk白祙喷水网站| 日韩欧美在线视频播放| 日韩欧美在线1卡| 性感女国产在线| 在线丝袜欧美日韩制服| 免费在线欧美视频| 黄色一级视频免费| 亚洲欧美日韩中文在线制服| 爱情电影网av一区二区| 欧美一级视频在线播放| 欧美国产禁国产网站cc| 亚洲国产999| 国产成人精品久久| 欧美成人高清| www.狠狠爱| 精品免费视频一区二区| 美女视频久久久| 国产欧美日韩不卡免费| 精品黑人一区二区三区国语馆| 精品国偷自产在线视频| 日韩有码欧美|