成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

看懂這篇文章,玩轉二叉查找樹

開發 前端
大家好,我是鴨血粉絲,拼著頭發掉光的風險給大家總結了這篇文章,我愿拿我明年的今天還是單身來祝愿你們能學會~

 大家好,我是鴨血粉絲,拼著頭發掉光的風險給大家總結了這篇文章,我愿拿我明年的今天還是單身來祝愿你們能學會~

所謂二叉查找樹,就是按照二分進行查找,每次查詢只需要選擇其中一個子樹就進行查找,從而減少查找次數,提升查詢效率!

[[314928]]

一、介紹

在前面的文章中,我們對樹這種數據結構做了一些基本介紹,今天我們繼續來聊聊一種非常常用的動態查找樹: 二叉查找樹。

二叉查找樹,英文全稱:Binary Search Tree,簡稱:BST,它是計算機科學中最早投入實際使用的一種樹形結構,特性如下:

  • 若左子樹不為空,則左子樹上所有結點的值均小于它的根結點的值;
  • 若右子樹不為空,則右子樹上所有結點的值均大于或等于它的根結點的值;
  • 它的左、右子樹也分別為二叉查找樹;

特性定義比較粗放,所以在樹形形態結構上,有著多樣,例如下圖:

上圖 a、b、c 三個圖,都滿足以上特性,也被稱為二叉查找樹,雖然通過中序遍歷可以得到一個有效的數組:[1、2、3、4、5、6、7、8],但是就查找效率來說,有著一定的差別,例如查詢目標為8的內容,從根目錄開始查詢,結構如下:

  • a圖,需要5次;
  • b圖,需要3次;
  • c圖,需要8次;

由此可見,不同的形狀,所需查找的次數是不一樣的,關于這一點,后面我們在介紹平衡二叉查找樹、紅黑樹這種數據結構的時候,會進行詳細介紹。

雖然二叉查找樹,在不同的形狀下,查找效率不一樣,但是它是學習其他樹形結構的基礎,了解了二叉查找樹的算法,相信再了解其他二叉樹結構會輕松很多。

二、算法思路

2.1、 新增

新增元素表示向二叉樹中添加元素,比較簡單。如果二叉樹為空,默認第一個元素就是根節點,如果二叉樹不為空,就以上面提到的特點為判斷條件,進行左、右節點的添加。

2.2、 查找

查找元素表示從根節點開始查找元素,如果根節點為空,就直接返回空值,如果不為空,通過以左子樹小于父節點,右子樹大于父節點的特性為依據進行判斷,然后以遞歸方式進行查找元素,直到找到目標的元素為止。

2.3、 刪除

刪除元素表示從二叉樹中移除要刪除的元素,邏輯稍微復雜一些。同樣,先要判斷根節點是否為空,如果為空,直接返回,如果不為空,分情況考慮。

被刪除的節點,右子樹為空

這種場景,只需要將被刪除元素的左子樹的父節點移動到被刪除元素的父節點,然后將被刪除元素移除即可。

  • 被刪除的節點,左子樹為空

這種場景,與上面類似,只需要將被刪除元素的右子樹的父節點移動到被刪除元素的父節點,然后將被刪除元素移除即可。

  • 被刪除的節點,左、右子樹不為空 

這種場景,稍微復雜一點,先定位到要刪除的目標元素,根據左子節點內容一定小于當前節點內容特點,找到目標元素的左子樹,通過遞歸遍歷找到目標元素的左子樹的右子樹,找到最末端的元素之后,進行與目標元素進行替換,最后移除最末端元素。

2.4、 遍歷

二叉樹的遍歷方式,分兩類:

  • 層次遍歷,從根節點開始;
  • 深度遍歷,又分為前序、中序、后序遍歷三種方式;

2.4.1、層次遍歷

層次遍歷,算法思路比較簡單,從根節點開始,分層從左到右進行遍歷元素。

2.4.2、深度遍歷

深度遍歷,在遍歷起始位置上又分三種,分別是前序遍歷、中序遍歷、后序遍歷,每種遍歷方式輸出的結果不一樣。

  • 前序遍歷:從樹根開始 -> 左子樹 -> 右子樹

  • 中序遍歷:從最末端左子樹開始 -> 樹根 -> 右子樹

  • 后序遍歷:從最末端左子樹 -> 右子樹 -> 最后到樹根

盡管二叉樹在遍歷方式上有多種,但是只要我們掌握了其中的思路原理,再去實現起來,就會輕松很多。

三、代碼實踐

首先創建一個實體數據結構BSTNode,內容如下:

然后,創建一個二叉查找樹操作類BinarySearchTree,內容如下:

最后,我們來測試一下,代碼內容如下:

 


輸出結果:

 

  1. ========插入元素======== 
  2. 插入關鍵字key=5  
  3. 插入到樹根節 
  4. 插入關鍵字key=2  
  5. 插入關鍵字key=7  
  6. 插入關鍵字key=1  
  7. 插入關鍵字key=6  
  8. 插入關鍵字key=4  
  9. 插入關鍵字key=8  
  10. 插入關鍵字key=3  
  11. 插入關鍵字key=9  
  12. 插入關鍵字key=10  
  13. ========中序遍歷元素======== 
  14. key:1 
  15. key:2 
  16. key:3 
  17. key:4 
  18. key:5 
  19. key:6 
  20. key:7 
  21. key:8 
  22. key:9 
  23. key:10 
  24. ========查找key為9的元素======== 
  25. 搜索關鍵字key=9  
  26. 搜索路徑[5 ->7 ->8 ->9 ->],搜索成功 
  27. 查找結果:true 
  28. ========刪除key為10的元素======== 
  29. 刪除關鍵字key=10  
  30. 開始搜索目標元素[5 ->7 ->8 ->9 ->10 ->],搜索成功 
  31. 刪除結果:true 
  32. ========再次中序遍歷元素======== 
  33. key:1 
  34. key:2 
  35. key:3 
  36. key:4 
  37. key:5 
  38. key:6 
  39. key:7 
  40. key:8 
  41. key:9 

四、總結

二叉查找樹,作為樹類型中一種非常重要的數據結構,有著非常廣泛的應用,但是二叉查找樹具有很高的靈活性,不同的插入順序,可能造成樹的形態差異比較大,如開文介紹的圖c,在某些情況下會變成一個長鏈表,此時的查詢效率會大大降低,如何解決這個問題呢,平衡二叉樹就要派上用場了,會在后面的文章進行介紹!

(第一句話是開玩笑,呸呸呸,情人節快樂)

責任編輯:華軒 來源: Java極客技術
相關推薦

2018-09-11 13:20:32

區塊鏈數字貨幣比特幣

2020-11-25 08:25:02

二叉樹節點

2020-04-27 07:05:58

二叉樹左子樹右子樹

2021-05-09 20:22:41

順序查找二叉查找數據結構

2020-05-06 16:41:36

紅黑樹二叉查找樹

2020-09-23 18:25:40

算法二叉樹多叉樹

2019-10-31 09:48:53

MySQL數據庫事務

2022-04-14 10:10:59

Nginx開源Linux

2021-09-29 10:19:00

算法平衡二叉樹

2022-12-26 00:51:33

雙向鏈表二叉搜索樹

2013-07-15 16:35:55

二叉樹迭代器

2021-03-17 08:19:22

二叉樹LeetCode

2021-04-20 08:37:14

數據結構二叉樹

2021-04-19 07:47:42

數據結構二叉樹Tree

2021-04-28 20:12:27

數據結構創建

2022-10-12 23:25:17

二叉樹父節點根節點

2019-04-17 15:16:00

Sparkshuffle算法

2021-04-09 08:40:51

網絡保險網絡安全網絡風險

2024-06-25 08:18:55

2017-03-30 22:41:55

虛擬化操作系統軟件
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 性福视频在线观看 | 91九色视频| 亚洲一区二区视频 | 搞黄网站在线观看 | 亚洲精品国产第一综合99久久 | 成人妇女免费播放久久久 | 国产精品免费观看视频 | 欧美日本高清 | 国产精品一区二区视频 | 日韩欧美精品一区 | 国产成人精品综合 | 久久久久国产精品一区 | 亚洲毛片在线观看 | 午夜一级做a爰片久久毛片 精品综合 | 精国产品一区二区三区四季综 | 99精品欧美一区二区三区 | 国产精品久久国产愉拍 | 国产高清无av久久 | 精品伊人久久 | 亚洲日韩中文字幕一区 | 日韩精品久久久 | 女人夜夜春 | 一区二区三区日本 | www.99热.com| 亚洲成人动漫在线观看 | 久久精品亚洲 | 久久免费精品 | 亚洲成人免费视频 | 韩日av在线| 欧美不卡在线 | 国产成人精品一区二区三区 | 午夜久久久久久久久久一区二区 | 亚洲成人一区二区在线 | 欧美日韩1区2区 | 亚洲午夜av久久乱码 | 国内精品视频 | 99热精品6 | 一区二区视屏 | 人妖av| 国产精品久久久久久久久久久免费看 | 国产电影一区 |