# [資料結構] CH7. Binary Search Trees
* Binary Search Trees是一個排序過的二元樹,它必須符合以下特性:
```
1.資料必須能夠定義大於等於小於。
2.左子樹的資料必定小於自己的資料。
3.右子樹的資料必定大於自己的資料。
```
* 有了這樣的特性,我們便可以用較快的速度搜尋資料,下面就來看看如何搜尋、插入以及刪除吧。
## 搜尋
* 搜尋的概念十分簡單,先檢查自己是不是該資料,如果不是且資料小於自己,往左子樹找;大於的話就往右子樹找。
```C++
Node* Search(Data d, Node *n)
{
//Can not find.
if(n == NULL)
return NULL;
if(n->data == d)
return n;
else if(n->data < d)
return Search(d, n->leftNode);
else
return Search(d, n->rightNode);
}
```
## 插入
* 插入也不難,一樣是比大小決定放左邊還是放右邊。
```C++
void Insert(Data d, Node *n)
{
if(n==NULL)
{
n = new Node;
n->data = d;
n->leftNode = NULL;
n->rightNode = NULL;
}
else
{
if(n->data < d)
Insert(d, n->leftNode);
else
Insert(d, n->rightNode);
}
}
```
## 刪除
* 刪除就稍微複雜一點了,我們必須確保它依然維持Binary Search Trees的特性。
* 刪除時我們分為幾種狀況來討論:
1.刪除的點在樹葉(也就是沒有子樹)。
2.刪除的點只有一個子樹。
3.刪除的點有兩個子樹。
* 當刪除的點是樹葉時,我們直接刪除即可:
```C++
if(n->leftNode == NULL && n->rightNode == NULL)
{
delete n;
n = NULL;
}
```
* 當刪除的點只有一個子樹,我們將該子樹替換成自己:
```C++
else if(n->leftNode == NULL)
{
n->rightNode = n;
}
else if(n->rightNode == NULL)
{
n->leftNode = n;
}
```
* 最後一個情形最複雜,我們有兩種做法:
* 將自己刪除後,找左子樹最大來替補自己:
```C++
else
{
Data leftMax;
leftMax = FindMax(n->leftNode);
n->data = leftMax;
Delete(n->leftNode, leftMax);
}
```
* 或是找右子樹最小替補:
```C++
else
{
Data rightMin;
rightMin = FindMin(n->rightNode);
n->data = rightMin;
Delete(n->rightNode, rightMin);
}
```
* 最後統整一下,整個刪除應為:
```C++
void Delete(Data d, Node* n)
{
//Can not find.
if(n == NULL) return;
if(n->data == d)
{
if(n->leftNode == NULL && n->rightNode == NULL)
{
delete n;
n = NULL;
}
else if(n->leftNode == NULL)
{
n->rightNode = n;
}
else if(n->rightNode == NULL)
{
n->leftNode = n;
}
else
{
Data leftMax;
leftMax = FindMax(n->leftNode);
n->data = leftMax;
Delete(n->leftNode, leftMax);
}
}
else if(n->data < d)
Delete(d, n->leftNode);
else
Delete(d, n->rightNode);
}
```
* 更多Code資訊請洽:[BST](https://github.com/Zero871015/BST)
###### tags: `DS` `note`