二分搜尋樹系列之「查詢(Search)-包含(Contain)」

ice_moss發表於2021-05-19

一. 查詢(Search)

1. 邏輯

前面我們瞭解了對節點的插入,其實在二分搜尋樹中對相應節點的查詢的過程中也有同樣的邏輯
下面我們來看看具體的查詢(Search):
我們在樹中查詢鍵值為42的節點

  1. 將42和41比較,42 > 41,根據二分搜尋樹的定義可知,我們應該繼續往41節點的右孩子查詢:
    二分搜尋樹系列之【查詢(Search)-包含(Contain)】

  2. 此時再將42和58比較,42 < 58,繼續向58節點的左孩子節點查詢
    二分搜尋樹系列之【查詢(Search)-包含(Contain)】

  3. 42 < 50,繼續向50節點的左孩子查詢,此時50節點的左孩子就為42,所以我們就找到了節點42,並返回對應的value值
    二分搜尋樹系列之【查詢(Search)-包含(Contain)】

如果我們要查詢的節點不存在,則返回空或false

2.程式碼實現(使用遞迴,c++實現)

在public中定義:

//找到key相應的節點並且返回value的地址
    Node *seacher(Key key, Value value) {
        return seacher(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);
}
二. 包含(Contain)
1. 邏輯

前面我們將了”查詢”,其實”包含”的邏輯和”查詢”是一樣的,只是目的不同,”查詢”的目的是找到我們需要找的節點並返回對應的地址;
*”包含(Contain)”的目的是判斷二分搜尋樹中是否存在一個節點,如果存在則返回true,否則返回false。*
其邏輯和操作過程和”查詢(Search)”一樣的

2. 程式碼實現(使用遞迴,c++實現)

在public中定義:

//在樹中尋找是否存在key
bool contain(Key key) {
    return contain(root, key);
}

在private中定義:

//在二分搜尋樹中查詢key,存在返回trun不存在返回false
bool contain(Node *node, Key key) {
    //元素不存在
  if (key == NULL)
        return false;
  //元素存在
  if (key == node->key)
        return true;

 else if (key > node->key)
        return contain(node->right, key);

 else return contain(node->left, key);
}

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章