二分搜尋樹系列之[ 插入操作 (insert) ]

yangkuang發表於2021-05-19

一. 定義二分搜尋樹

首先定義一顆二分搜尋樹,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的節點

  1. 首先60會和整個數的根節點比較,顯然60 > 41 所以將60,繼續和41節點的右孩子進行比較:
    二分搜尋樹系列之【 插入操作 (insert) 】
  2. 此時 60 > 58 ,所以將60 繼續和58節點的右孩子節點進行比較,但58節點的右孩子為空,這時 60 節點就插入為58節點的右孩子:
    二分搜尋樹系列之【 插入操作 (insert) 】

下面我們再向二分搜尋樹中插入鍵值為28的節點:

  1. 節點28和二分搜尋樹的根節點41比較,28 < 41 ,將28繼續和41節點的左孩子節點比較:
    二分搜尋樹系列之【 插入操作 (insert) 】
  2. 此時28 > 22, 再將28和22節點的左孩子比較:
    二分搜尋樹系列之【 插入操作 (insert) 】
  3. 28 < 33,繼續將節點28和33節點的右孩子比較,但此時33的左孩子為空,28節點就插入為節點33的左孩子:
    二分搜尋樹系列之【 插入操作 (insert) 】

如果出現插入的節點和二分搜尋樹中的節點重合的情況,依然是同理,只需要將原來節點覆蓋即可

三. 程式碼實現

新節點的插入操作的邏輯明白了,下面我們開始帶著這種邏輯進入程式碼的實現(使用遞迴版本,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 協議》,轉載必須註明作者和本文連結

相關文章