一. 定義二分搜尋樹
首先定義一顆二分搜尋樹,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中寫:
//插入操作
//向以node為根節點的二分搜尋樹中,插入節點(key,value),使用遞迴演算法
//返回插入新節點後的二分搜尋樹的根
Node *insert(Node *node, Key key, Value value) {
if (node == NULL) {
count++;
return new Node(key, value);
}
if (key == node->key) {
node->value = value;
}
else if (key > node->key) {
node->right = insert(node->right, key, value);
}
else //key < node->key
node->left = insert(node->left, key, value);
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結