二叉搜尋樹的實現(查詢,插入,刪除的遞迴與非遞迴)

2021-08-01 05:19:48 字數 3147 閱讀 7659

bst定義:

二叉搜尋樹:又稱二叉排序樹,它或者是一棵空樹,或者是具有以下性質的二叉樹

1、若它的左子樹不為空,則左子樹上所有節點的值都小於根節點的值

2、若它的右子樹不為空,則右子樹上所有節點的值都大於根節點的值

3、它的左右子樹也分別為二叉搜尋樹

除此之外,還有一點值得在意:二叉搜尋樹的最左節點是所有節點的值中最小值,而最右節點則是最大值。

bst的實現:

1.節點的定義:

templatestruct node

k _key;

v _value;

node* _pleft;

node* _pright;

};

2.查詢節點中指定key值的節點的實現

①非遞迴

node* find(const k& key)    //外部介面

node* _find(node* proot,const k& key) //實現方法

else if(key>proot->_key)

else

return proot;

} return null;

}

②非遞迴

node* find(const k& key)   //外部介面

node* _find(node* proot,const k& key) //實現方法

3.插入指定key值與value值的節點

由於在這裡我們認為key值是區分這些節點的關鍵字,而且是不能重複的,所以有以下實現:

①非遞迴

bool insert(const k& key, const v& value)   //外部介面

bool _insert(node*& proot,const k& key,const v& value) //實現方法

node* pcur=proot;

node* parent=null;

while(pcur)

else

}pcur=new node(key,value);

if(key_key)

parent->_pleft=pcur;

else

parent->_pright=pcur;

return true;

}

②遞迴

bool insert(const k& key, const v& value)   //外部介面

bool _insert(node*& proot,const k& key,const v& value) //實現方法

if(proot->_key==key)

return false;

if(key_key)

return _insert(proot->_pleft,key,value);

else

return _insert(proot->_pright,key,value);

}

4.刪除指定key值的節點

對於刪除這一操作,我們仔細分析一下當中節點可能的情況:

1.有右孩子無左孩子,且在雙親的右子樹中

2.有右孩子無左孩子,且在雙親的左子樹中

3.有右孩子無左孩子,且為根節點

4.有左孩子無右孩子,且在雙親的右子樹中

5.有左孩子無右孩子,且在雙親的左子樹中

6.有左孩子無右孩子,且為根節點

7.有左孩子有右孩子,且為根節點

8.有左孩子有右孩子,但不為根節點

①非遞迴

bool remove(const k& key)    //外部介面

bool _remove(node*& proot,const k& key) //實現方法

else if(key>pcur->_key)

else

else if(pcur->_pright==null)

else

pcur->_key=pdel->_key;

pcur->_value=pdel->_value;

if(pdel==parent->_pleft)

else

pcur=pdel;

}delete pcur;

return true;

} }return false;

}

②遞迴

bool remove(const k& key)   //外部介面

bool _remove(node*& proot,const k& key) //實現方法

else if(pcur->_pright==null)

else

pdel->_key=pcur->_key;

pdel->_value=pcur->_value;

_remove(proot->_pright,pcur->_key);

} return true;

}}

二叉搜尋樹的插入,查詢,刪除

include using namespace std template class node 預設析構函式 templatenode node template node node t value template class bstree 預設析構 void buildbstree 建立二叉樹 ...

二叉搜尋樹的查詢 插入 刪除

coding utf 8 time 2020 9 23 15 56 author julyli file bst.py class bitreenode def init self,data self.data data self.lchild none self.rchild none self....

二叉搜尋樹的插入 刪除 查詢

1 若左子樹不空,則左子樹上所有節點的值均小於它的根節點的值 2 若右子樹不空,則右子樹上所有節點的值均大於它的根節點的值 3 左 右子樹也分別為二叉排序樹 4 沒有鍵值相等的節點 插入的資料之後要滿足二叉樹的性質1和2,所以要先找到插入位置,且插入的位置一定是在葉子節點的下面 所以插入分兩個步驟 ...