一. 查詢(Search)
1. 邏輯
前面我們瞭解了對節點的插入,其實在二分搜尋樹中對相應節點的查詢的過程中也有同樣的邏輯
下面我們來看看具體的查詢(Search):
我們在樹中查詢鍵值為42的節點
將42和41比較,42 > 41,根據二分搜尋樹的定義可知,我們應該繼續往41節點的右孩子查詢:
此時再將42和58比較,42 < 58,繼續向58節點的左孩子節點查詢
42 < 50,繼續向50節點的左孩子查詢,此時50節點的左孩子就為42,所以我們就找到了節點42,並返回對應的value值
如果我們要查詢的節點不存在,則返回空或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 協議》,轉載必須註明作者和本文連結