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,所以要先找到插入位置,且插入的位置一定是在葉子節點的下面 所以插入分兩個步驟 ...