1. 程式人生 > >二叉搜尋樹的節點插入,查詢。

二叉搜尋樹的節點插入,查詢。

在講解二分搜尋樹之前,我想先講清楚一個東西,那就是遞迴,因為在後面的插入,查詢操作都是利用遞迴去查詢的,而且對於遞迴的理解也是一個難點,因此,以下是我對於遞迴的理解。

,對於遞迴,我們不能用人腦去展開來想,所以,我們只需要把遞迴過程中的兩個過程給想清楚就好了,一個是遞迴發生在終止條件的時候,還有一個是遞迴在不斷縮小規模的過程中其中的一個情況,具體我們可以見下圖:


我們把最下面的方框理解為遞迴的出口,也就是遞迴發生終止時的情況,而上面的方框,我們理解為在終止條件發生前的前一個情況,因為一個人遞迴操作就是由這兩種情況組成的,因此,我們只需要理清上面的兩種情況就能夠很好的理解遞迴了。

對於涉及到遞迴的問題,我們可以按照上圖的思路來寫出遞迴函式。

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 );
    }
};