淺析二分搜尋樹的資料結構的實現(Java 實現)
阿新 • • 發佈:2020-03-31
[toc]
# 樹結構簡介
- 線上性資料結構中,資料都是排成一排存放的;而樹結構則是非線性的,儲存在其中的資料是按分支關係組織起來的結構,就像自然界中的樹那樣。如下圖所示:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200302164519552.jpg)
- 從圖可以看出樹結構是有一種層次感的,每一個點可以有多個分支,這種組織結構是非常有優勢的,簡單來說樹結構本身是一種天然的組織結構。
- 對於這種組織結構,日常生活中是非常常見的,比如電腦磁碟中的資料夾、公司中的人員組織結構、家族的族譜等等,如以下幾圖所示:
![磁碟檔案結構圖](https://img-blog.csdnimg.cn/2020030217041058.jpg)
![公司成員組織結構圖](https://img-blog.csdnimg.cn/20200302171558223.jpg)
![族譜圖示例](https://img-blog.csdnimg.cn/20200302171800252.jpg)
- 除了組織資料,使用樹結構儲存資料時,在某些情況下,處理資料是十分高效的。而我們就可以針對各種特殊情況去設計出各情況適合的高效率的樹結構。
- 舉個例子:比如對於查詢一個數據,線上性結構中如果不知道具體位置的話需要在一堆資料裡一個一個地去尋找;而對於樹結構,因為樹結構分支的形式,各個資料可以存在不同的分支中,在查詢時就可以依據這些分支快速地找到想要的資料。
- 比如,磁碟中不同的資料夾存放不同的檔案,我們在查詢一個檔案時,就可以根據資料夾名稱去找到想要的檔案。
- 以上就是樹結構的一些特點的簡單介紹,接下來就開始分析一下樹結構中的二分搜尋樹的基礎知識以及實現出這個資料結構的一些常用操作。
---
# 二分搜尋樹的基礎知識
## 二叉樹的基本概念
- 在瞭解二分搜尋樹之前,需要先了解二叉樹的基本概念,因為二分搜尋樹是基於二叉樹的。實際上,二叉樹是樹結構中最常見的樹結構,也是樹結構中最為基礎的結構。
- 對於二叉樹,和連結串列一樣,也是一種動態的資料結構,使用者不需要擔心容量的問題,設計者也不需要手動地設計動態伸縮容量的方法。
- 同時,二叉樹也是由一個一個節點組成的,而對於其中的每一個節點,除了儲存資料之外,還需要有兩個子節點,分別指向這個節點的左節點和右節點(也稱為左孩子和右孩子)。
- 此外,二叉樹還具有以下特性:
1. 二叉樹具有唯一根節點。
2. 二叉樹每個節點最多有兩個孩子。
3. 二叉樹中沒有孩子的節點稱為葉子節點。
4. 二叉樹每個節點最多隻有一個父親節點。
5. 二叉樹具有天然的遞迴結構:
1. 每個節點的左子樹也是二叉樹。(每個節點的左節點是左子樹的根節點)
2. 每個節點的右子樹也是二叉樹。(每個節點的右節點是右子樹的根節點)
6. 二叉樹不一定是滿的:
1. 一個節點也是二叉樹。(左右孩子為空)
2. NULL(空)也是二叉樹。
- 以上特性歸納為圖片表示如下:
![二叉樹特性示例](https://img-blog.csdnimg.cn/20200302222916548.jpg)
- 二叉樹的幾種常見形態
1. 空二叉樹
![空二叉樹](https://img-blog.csdnimg.cn/20200302224751572.jpg)
2. 只有一個節點的二叉樹
![只有一個節點的二叉樹](https://img-blog.csdnimg.cn/20200302224808604.jpg)
3. 只有左節點的二叉樹
![只有左節點的二叉樹](https://img-blog.csdnimg.cn/20200302224822787.jpg)
4. 只有右節點的二叉樹
![只有右節點的二叉樹](https://img-blog.csdnimg.cn/2020030222483552.jpg)
5. 完全二叉樹
![完全二叉樹](https://img-blog.csdnimg.cn/20200302224412374.jpg)
6. 滿二叉樹
![滿二叉樹](https://img-blog.csdnimg.cn/2020030222484634.jpg)
## 二分搜尋樹的基本概念
- 在瞭解了以上二叉樹的基本概念之後,那麼對於二分搜尋樹就不需要再瞭解以上概念了,因為二分搜尋樹就是一棵二叉樹,只不過它有屬於它自己的一些特性。
- 對於二分搜尋樹,它具有以下特性:
1. 二分搜尋樹的每個節點的值大於其左子樹的所有節點的值。
2. 二分搜尋樹的每個節點的值小於其右子樹的所有節點的值。
3. 二分搜尋樹的每一棵子樹也是二分搜尋樹。
4. 二分搜尋樹儲存的元素必須有可比較性。
- 二分搜尋樹圖示
![二分搜尋樹示例](https://img-blog.csdnimg.cn/20200302225857835.jpg)
## 二分搜尋樹的基本結構程式碼實現
- 綜上以上基本概念,可設計二分搜尋樹的基本結構的程式碼如下:
```java
/**
* 二分搜尋樹資料結構實現類
* 支援具有可比較性的泛型
*
* @author 踏雪彡尋梅
* @date 2020/3/2 - 23:05
*/
public class BST