国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

前端: 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。

 

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

2013-07-15 16:35:55

二叉樹迭代器

2020-04-27 07:05:58

二叉樹左子樹右子樹

2021-09-29 10:19:00

算法平衡二叉樹

2021-04-20 08:37:14

數據結構二叉樹

2020-09-23 18:25:40

算法二叉樹多叉樹

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

2020-12-30 08:35:34

貪心算法監控

2022-10-26 23:58:02

二叉樹數組算法

2021-03-17 08:19:22

二叉樹LeetCode

2021-04-28 20:12:27

數據結構創建

2021-08-27 11:36:44

二叉樹回溯節點

2020-11-02 09:15:47

算法與數據結構

2018-03-15 08:31:57

二叉樹存儲結構

2021-05-06 17:46:30

二叉樹數據結構

2021-09-15 07:40:50

二叉樹數據結構算法

2021-10-12 09:25:11

二叉樹樹形結構

2021-03-22 08:23:29

LeetCode二叉樹節點
點贊
收藏

51CTO技術棧公眾號

91麻豆免费在线视频| 国产91精品露脸国语对白| 久久久久久久久国产| 成人美女黄网站| 日韩美女主播在线视频一区二区三区| av在线电影免费观看| 欧美午夜在线观看| 调教视频免费在线观看| 色av成人天堂桃色av| h网站在线播放| 亚洲综合久久久久| 国产污污在线观看| 精品毛片三在线观看| 四虎影院在线播放| 一本色道久久加勒比精品| 国产在线观看精品一区| 欧美色精品在线视频| 国产激情在线视频| 亚洲国产福利在线| 欧美日韩五区| 欧美激情视频在线| 亚洲调教一区| 91久久久久久久久久| 亚洲日韩视频| 日韩一区二区三区资源| 国产一区在线观看麻豆| 男人添女人荫蒂免费视频| 国产亚洲美州欧州综合国| 日本aa大片在线播放免费看| 日韩欧美国产一区二区| 日韩特级毛片| 久久综合久中文字幕青草| 亚洲桃色综合影院| 国产精品日韩二区| 国产综合色在线视频区| 一区二区在线播放视频| 亚洲第一主播视频| 中日韩高清电影网| 日韩视频免费大全中文字幕| 奇米影视777在线欧美电影观看| 成人免费视频在线观看超级碰| 91久久久久| 日本一道在线观看| 日韩码欧中文字| yjizz视频网站在线播放| 337p日本欧洲亚洲大胆精品 | 日本免费高清视频| 色94色欧美sute亚洲13| 国产美女情趣调教h一区二区| 日韩在线观看免费高清| 国产欧美日韩精品高清二区综合区| 91九色国产视频| 韩国一区二区三区| caoporn超碰国产公开| 欧美日韩精品免费| www一区二区三区| 亚洲va码欧洲m码| 丁香亚洲综合激情啪啪综合| 伊人国产在线| 中文字幕不卡在线视频极品| 亚洲成av人片一区二区密柚| 国产高清不卡无码视频| 亚洲一区二区三区免费视频| 亚洲天堂电影| 国产精品一区久久| 丁香桃色午夜亚洲一区二区三区| 一级在线免费观看| 中文字幕日韩欧美| 91成人精品观看| 欧洲精品视频在线观看| av大大超碰在线| 50度灰在线观看| 91福利视频网| 一区二区三区四区视频精品免费 | 视频一区视频二区视频三区高 | 婷婷亚洲五月| 黄色三级电影网| 久久综合中文色婷婷| 欧美婷婷久久五月精品三区| 日韩av一级大片| 999在线观看视频| 国产一区二区精品| 久久天天狠狠| 亚洲欧洲性图库| 乱中年女人伦av一区二区| 天天天干夜夜夜操| 亚洲乱码国产乱码精品精| 成人高清av| 91亚洲精选| 蜜桃欧美视频| 亚洲精品资源在线| 久久深夜福利| 精品中文一区| 亚洲无线看天堂av| av资源一区二区| 日韩不卡在线观看| 久久午夜电影| 动漫成人在线观看| 91在线中文字幕| 国产欧美日韩三级| 中文字幕有码在线观看| 欧美二区在线看| 亚洲视屏在线播放| 国产在线视视频有精品| 欧美经典影片视频网站| 少妇久久久久久被弄到高潮| 5566中文字幕一区二区电影| 欧美成人一品| 欧美18一19xxx性| 日本成人性视频| 高清欧美性猛交xxxx| 99精品一区二区| 国产一区二区三区四区五区3d| 日韩精品 欧美| 日韩一区二区三区四区五区六区| 一级毛片精品毛片| 日本免费在线观看| 欧美精品久久久久久久久25p| 岛国一区二区三区高清视频| 国产玉足脚交久久欧美| 狠狠爱免费视频| 99精品在线免费视频| 国产精品激情av电影在线观看| 精品国产sm最大网站免费看| 精品国产乱码久久久久久天美| 欧州一区二区| 午夜激情视频在线| 1024欧美极品| wwwxxx黄色片| 亚洲国产一二三精品无码| 国产福利视频一区| 日韩av不卡电影| 91精品免费在线观看| 亚洲成a人片综合在线| 国产欧美日韩一区二区三区在线| 日韩成人av在线资源| av播放在线| 国产911网站| 在线观看亚洲色图| 一道本在线观看视频| 91影院在线免费观看视频| 久久久91精品国产| 欧美三级中文字| 国产欧美日韩三区| 国产精品一区免费在线观看| 粉嫩精品导航导航| 九九在线视频| 日本我和搜子同居的日子高清在线 | 青青在线视频免费观看| 欧美男插女视频| 欧美性大战久久| 麻豆91精品91久久久的内涵| 欧美精品国产白浆久久久久| 蜜臀av国内免费精品久久久夜夜| 欧美自拍小视频| 伊人久久99| 精品国产一区二区三区免费 | 亚洲v精品v日韩v欧美v专区| 欧美日韩国产欧| 亚洲人metart人体| 日本国产精品| 亚洲www.| 国产福利片在线观看| 美女欧美视频在线观看免费| 中文字幕高清在线| 日本18视频网站| 国产美女特级嫩嫩嫩bbb片| 最近中文视频在线| √天堂8资源中文在线| 欧美性爽视频| 欧美白人做受xxxx视频| 天天爽人人爽夜夜爽| 国产精品一级久久久| 亚洲巨乳在线观看| 亚洲影院在线看| 日本久久久久久久久久久| 日韩在线精品视频| 日韩视频免费在线观看| 欧美午夜影院在线视频| 亚洲视频一二区| 婷婷成人激情在线网| 91成人国产精品| 欧亚一区二区三区| 91精品国产乱码| 91 com成人网| 精品调教chinesegay| 欧美日韩综合在线免费观看| 欧美色电影在线| 欧美超级免费视 在线| 青青久久av北条麻妃黑人| 6080yy精品一区二区三区| 精品中文字幕视频| 亚洲美女激情视频| 国产成人在线一区二区| 免费日韩电影在线观看| 91国产在线播放| 神马欧美一区二区| 成人拍拍拍在线观看| 撸视在线观看免费视频| www.com.cn成人|