一. 定義二分搜尋樹
首先定義一顆二分搜尋樹,C++程式碼如下:
#include <iostream>
#include <queue>
#include <cassert>
using namespace std;
//套用模板函式
template <typename Key, typename Value>
class BST {
private:
//構造節點Node
struct Node {
Key key;
Value value;
Node *left; //左孩子指標
Node *right; //右孩子指標
Node(Key key, Value value) {
this->key = key;
this->value = value;
//初始值為空
this->left = this->right = NULL;
}
Node(Node *node){
this->key = node->key;
this->value = node->value;
this->left = node->left;
this->right = node->right;
}
};
//根節點
Node *root;
//節點數量
int count;
public:
//建構函式
BST() {
//初始值為空
root = NULL;
count = 0;
}
//解構函式
~BST() {
distroy(root);
}
二. 插入節點
接下來我們開始對二分搜尋樹中進行插入節點,如圖:
我們向樹中插入鍵值為60的節點
- 首先60會和整個數的根節點比較,顯然60 > 41 所以將60,繼續和41節點的右孩子進行比較:
- 此時 60 > 58 ,所以將60 繼續和58節點的右孩子節點進行比較,但58節點的右孩子為空,這時 60 節點就插入為58節點的右孩子:
下面我們再向二分搜尋樹中插入鍵值為28的節點:
- 節點28和二分搜尋樹的根節點41比較,28 < 41 ,將28繼續和41節點的左孩子節點比較:
- 此時28 > 22, 再將28和22節點的左孩子比較:
- 28 < 33,繼續將節點28和33節點的右孩子比較,但此時33的左孩子為空,28節點就插入為節點33的左孩子:
如果出現插入的節點和二分搜尋樹中的節點重合的情況,依然是同理,只需要將原來節點覆蓋即可
三. 程式碼實現
新節點的插入操作的邏輯明白了,下面我們開始帶著這種邏輯進入程式碼的實現(使用遞迴版本,c++實現):
我們在public中定義函式:
//插入操作
void insert(Key key, Value value) {
//向根節點中插入key, value
root = insert(root, key, value);
}
接下來我們在private中寫:
//在二分搜尋樹中找到相應元素並返回該元素的地址
Value *seacher(Node *node, Key key) {
if (key == NULL)
return NULL;
//找到key 返回value的地址
if (key == node->key)
return &(node->value);
else if (key > node->key)
return seacher(node->right, key);
else return seacher(node->left, key);
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結