【資料結構】二叉搜尋樹!!!
二叉搜尋樹的結構類似於二分查詢的思想,在二叉樹結構裡面,將資料的大小分為樹的左右子樹,從而在搜尋的時候類似於二叉搜尋。
如圖:
當搜尋一個二叉搜尋樹的時候時間複雜度就是O(logN).
構建搜尋二叉樹:
BSTree(int *arr,size_t size)
:_root(NULL)
{
int index = 0;
for(int i = 0;i<size;i++)
_GreatNode(_root,arr,index++,size);
}
void _GreatNode(Node* root,int *arr,int index,size_t size){
Node* tmp = new Node(arr[index]);
if(root == NULL){
_root = tmp;
return;
}
int d = arr[index];
Node* parent = NULL;
while(root){
parent = root;
if(d < root->value)
root = root->left;
else
root = root->right;
}
if(d < parent->value)
parent->left = tmp;
else
parent->right = tmp;
}
搜尋二叉樹的刪除
搜尋二叉樹的刪除分為以下幾種情況:
- 當刪除的搜尋二叉樹為空樹 的時候
- 當刪除的搜尋二叉樹只有右子樹的時候
- 當刪除的搜尋二叉樹只有左子樹的時候
當刪除的搜尋二叉樹的左右子樹都存在的時候
注:這裡面的第一種情況可以和第二或者第三種情況進行合併
當二叉搜尋樹只有左子樹的時候:
當二叉搜尋樹是由右子樹的時候:
當二叉搜尋樹左右孩子都存在的時候:
當二叉搜尋樹的左右子樹都存在的時候就可以在樹的左右子樹裡面尋找一個節點將需要刪除的結點的值進行替換,從而去刪除那個替換過的結點。
實現程式碼:
void _Del_Tree(Node* root,int key){
if(NULL == root)
return ;
Node* tmp = find(key);
Node* parent = _find_parent(_root,key);
if(NULL == tmp)
return ;
if(tmp->left == NULL){ //當二叉搜尋樹的左孩子為空的時候
if(tmp == _root)
_root = tmp->right;
else{
if(tmp == parent->left)
parent->left = tmp->right;
else
parent->right = tmp->right;
}
delete tmp;
}
else if(tmp->right == NULL){ //當二叉搜尋樹的右孩子為空的時候
if(tmp == _root)
_root = tmp->left;
else{
if(tmp == parent->left)
parent->left = tmp->left;
else
parent->right = tmp->left;
}
delete tmp;
}
else{
Node* pkey = NULL;
//先尋找所有孩子裡面可以替換的孩子節點
if(tmp->left->right){
pkey = tmp->left->right;
parent = tmp->left;
}
if(tmp->right->left){
pkey = tmp->right->left;
parent = tmp->right;
}
//當沒有找到可以替換的節點的時候直接進行交換刪除
if(pkey == NULL){
swap(tmp->value,tmp->right->value);
Node* del = tmp->right;
tmp->right = del->right;
delete del;
}
else{ //當找到可以交換的孩子節點的時候將節點進行交換,然後繼續向下刪除交換的節點
swap(pkey->value,tmp->value);
_Del_Tree(root,key);
}
}
}
相關文章
- 資料結構-二叉搜尋樹資料結構
- 資料結構之「二叉搜尋樹」資料結構
- 資料結構☞二叉搜尋樹BST資料結構
- 資料結構中的樹(二叉樹、二叉搜尋樹、AVL樹)資料結構二叉樹
- 資料結構-二叉搜尋樹的實現資料結構
- 【資料結構】搜尋樹資料結構
- 二叉搜尋樹的結構
- 資料結構之二叉搜尋樹—Java實現資料結構Java
- 演算法與資料結構——AVL樹(平衡二叉搜尋樹)演算法資料結構
- 資料結構:一文看懂二叉搜尋樹 (JavaScript)資料結構JavaScript
- 資料結構高階--二叉搜尋樹(原理+實現)資料結構
- 【資料結構】【二叉樹】四、二叉搜尋樹的特性(不斷補充)資料結構二叉樹
- 資料結構學習系列之二叉搜尋樹詳解!資料結構
- 資料結構-二分搜尋樹資料結構
- 資料結構和演算法-Go實現二叉搜尋樹資料結構演算法Go
- 資料結構之樹結構概述(含滿二叉樹、完全二叉樹、平衡二叉樹、二叉搜尋樹、紅黑樹、B-樹、B+樹、B*樹)資料結構二叉樹
- 【資料結構與演算法】二叉搜尋樹的簡單封裝資料結構演算法封裝
- 資料結構之PHP二分搜尋樹資料結構PHP
- 資料結構(樹):二叉樹資料結構二叉樹
- 二叉搜尋樹
- 《戀上資料結構與演算法》筆記(九):二叉搜尋樹 II資料結構演算法筆記
- 資料結構 - 二叉樹資料結構二叉樹
- 資料結構-二叉樹資料結構二叉樹
- 看圖輕鬆理解資料結構與演算法系列(二叉搜尋樹)資料結構演算法
- LeetCode 95 | 構造出所有二叉搜尋樹LeetCode
- 資料結構之「二叉樹」資料結構二叉樹
- 資料結構-平衡二叉樹資料結構二叉樹
- 二叉搜尋樹的第 k 個結點
- 演算法與資料結構之二分搜尋樹演算法資料結構
- 從二分搜尋到二叉搜尋樹
- Day20 | 654.最大二叉樹 、 617.合併二叉樹 、 700.二叉搜尋樹中的搜尋 98.驗證二叉搜尋樹二叉樹
- 資料結構 二叉樹遍歷資料結構二叉樹
- 資料結構二叉樹學習資料結構二叉樹
- 資料結構-二叉樹、堆、圖資料結構二叉樹
- 資料結構——二叉樹進階資料結構二叉樹
- 二叉搜尋樹的2層結點統計
- 程式碼隨想錄day18 || 530 二叉搜尋樹最小差,501 二叉搜尋樹眾數,236 二叉搜尋樹最近公共祖先
- 二叉搜尋樹的操作集