從圖上可得出二叉排序樹的基本概念。
左子樹小於根,右子樹大於根
中序遍歷後有序
樹中最小的樹在最左邊,最大的在最右邊
這裡主要分析一下二叉排序樹的插入和刪除。
pcur =
new node(key, value);
if (key < pparent->_key)
else
if(key>pparent->_key)
這裡只擷取插入時的**,即因為已經找到插入位置。
我們只需建立乙個新的節點,然後判斷待插入的key值和當前根節點的大小,即可進行插入,二叉排序樹的插入都是在空指標域出進行。
整個程式應該就刪除比較複雜一點,只要能將它的示意圖畫出來,其實就很簡單了。
刪除的幾種情況:
畫圖的水平略顯粗糙
如果左右子樹都沒有的話,直接進行刪除就好了,如果是只有右子樹或者左子樹,那就要分情況了,如下:
單獨沒有右子樹和單獨沒有左子樹同理。
如果左右都有的話:
下面是整個**
#pragma once
#include
#include
using namespace std;
template
struct bstnode
bstnode* _pleft;
bstnode* _pright;
k _key;
v _value;
};template
class bstree
bool insert(const k& key, const v& value)
node* pcur = _proot;
node* pparent =
null;
while (pcur)
else
if (key>pcur->_key)
else
}//找到了插入的位置,然後建立待插入的結點
pcur =
new node(key, value);
if (key < pparent->_key)
else
if (key>pparent->_key)
return
true;
}bool remove(const k& key)
//開始找刪除的位置
node *pcur = _proot;
node *pparent =
null;
while (pcur)
else
if (key>pcur->_key)
else
break;
}//出了迴圈,位置肯定找到了
if (pcur ==
null)
if (null
== pcur->_pleft)
else
if (pparent->_pleft == pcur)//判斷是否為雙親的左結點
else
//雙親的右結點
}else
if (null
== pcur->_pright)
else
if (pparent->_pright = pcur)
else
}else
//到了這裡,說明待刪除的結點左右孩子都有
swap(pcur->_key, first->_key);
swap(pcur->_value, first->_value);
pcur = first;
if (pcur->_pleft ==
null)
else
}else
if (pcur->_pright ==
null)
else}}
delete pcur;
pcur =
null;
return
true;
}node* find(const k& key)
return pcur;
}bool insert_r(const k& key, const v& value)
bool remove_r(const k& key)
void midorder()
protected:
bool _insert_r(node*& proot, const k& key, const v& value)
if (key < proot->_key)
return _insert_r(proot->_pleft, key, value);
else
if (key>proot->_key)
return _insert_r(proot->_pright, key, value);
else
return
false;
}bool _remove_r(node *&proot, const k&key)
swap(pcur->_key, first->_key);
swap(pcur->_value, first->_value);
return _remove_r(proot->_pright, key);
}delete pcur;
pcur =
null;
return
true;}}
void _midorder(node* _proot)
protected:
bstnode* _proot;
};
最後是測試**:
#include"5_15sortbinarytree.h"
int main()
; bstree s;
for (int idx = 0; idx < 10; idx++)
s.midorder();
s.remove(5);
s.midorder();
return
0;}
查詢演算法 樹表查詢之二叉排序樹
從前面介紹的查詢方法我們知道,折半查詢較順序查詢速度快,但折半查詢要求表中記錄必須有序,因為當在已排序的表中找到新記錄恰當的位置時,需要移動許多記錄以便為新記錄騰出位置。有沒有哪一種組織記錄的方法使得記錄的插入與查詢都能夠很快地完成呢?本篇部落格介紹的樹表查詢就能解決這個問題。二叉排序樹 bst 也...
動態查詢表(二叉排序樹)
動態查詢表的特點是 表結構在查詢過程中動態生成的,即對於給定值key,若表中存在等於key的記錄,則查詢成功,否則插入關鍵字key的記錄。1 二叉排序樹 1 可以是空樹 2 滿足下列條件 若左子樹不空,則所有的左子樹值小於根節點值。若右子樹不空,則所有的右子樹值大於根節點值。他的左右子樹也分別是二叉...
查詢 二叉排序樹
順序查詢 順序查詢又叫線性查詢,是最基本的查詢技術,它的查詢過程是 從表中第乙個記錄開始,逐個進行記錄的關鍵字和給定值比較,若某個記錄的關鍵字和給定值相等,則查詢成功,找到所查的記錄 如果知道最後乙個記錄,其關鍵字和給定值比較都不等時,則表中沒有所查的記錄,查詢不成功。順序查詢演算法實現 如下 順序...