二叉搜尋樹的節點插入,查詢。
在講解二分搜尋樹之前,我想先講清楚一個東西,那就是遞迴,因為在後面的插入,查詢操作都是利用遞迴去查詢的,而且對於遞迴的理解也是一個難點,因此,以下是我對於遞迴的理解。
,對於遞迴,我們不能用人腦去展開來想,所以,我們只需要把遞迴過程中的兩個過程給想清楚就好了,一個是遞迴發生在終止條件的時候,還有一個是遞迴在不斷縮小規模的過程中其中的一個情況,具體我們可以見下圖:
我們把最下面的方框理解為遞迴的出口,也就是遞迴發生終止時的情況,而上面的方框,我們理解為在終止條件發生前的前一個情況,因為一個人遞迴操作就是由這兩種情況組成的,因此,我們只需要理清上面的兩種情況就能夠很好的理解遞迴了。
對於涉及到遞迴的問題,我們可以按照上圖的思路來寫出遞迴函式。
1.對終止條件進行判斷 if(終止條件成立)
2.如果有必要的話,對傳入的引數改造,或者自己產生引數
3.把我們產生的目標引數返回給上一層
4.接受來自上上層傳遞過來的引數
5.對傳遞過來的引數進行改造,把目標引數發往下一層級
6.接受下一層級往上傳過來的目標引數,有必要的話對其利用或者改造。
7.把目標引數(需要返回的引數)發往上一層。
理解了上面的7點後,對於下面的遞迴操作就不難理解了。
我們首先來看看往二叉樹中插入節點的方法:
// 向以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->left = insert( node->left , key, value); else // key > node->key node->right = insert( node->right, key, value); return node; } };
第一點:對終止條件進行判斷 if(終止條件成立)。
if( node == NULL )
第二點:如果有必要的話,對傳入的引數改造,或者自己產生引數。
newNode(key, value)
第三點:把我們產生的目標引數返回給上一層。
returnnewNode(key, value);
第四點:接受來自上上層傳遞過來的引數。
Node *node, Key key, Value value
第五點:對傳遞過來的引數進行改造,把目標引數發往下一層級。
insert( node->left , key, value);
insert( node->right, key, value)
第六點:接受下一層級往上傳過來的目標引數,有必要的話對其利用或者改造。
node->left = insert( node->left , key, value);
node->right = insert( node->right, key, value);
第七點:把目標引數(需要返回的引數)發往上一層。
return node;
根據以上的分析,我們發現遞迴函式大多符合上面的七點,因此我們只要按照上面的7
點為根本,然後再加上一些額外的操作,則一個遞迴函式差不多就寫好了。
二叉樹的查詢(查詢二叉樹中是否存在某個key):
// 檢視以node為根的二分搜尋樹中是否包含鍵值為key的節點, 使用遞迴演算法
bool contain(Node* node, Key key){
if( node == NULL )
return false;
if( key == node->key )
return true;
else if( key < node->key )
return contain( node->left , key );
else // key > node->key
return contain( node->right , key );
}
二叉搜尋樹的查詢(查詢樹中key相對應的value):
// 在以node為根的二分搜尋樹中查詢key所對應的value, 遞迴演算法
// 若value不存在, 則返回NULL
Value* search(Node* node, Key key){
if( node == NULL )
return NULL;
if( key == node->key )
return &(node->value);
else if( key < node->key )
return search( node->left , key );
else // key > node->key
return search( node->right, key );
}
};