1. 二叉排序樹(shù)
- 如果它的左子樹(shù)不為空,那么左子樹(shù)上的所有結(jié)點(diǎn)的值均小于它的根結(jié)點(diǎn)的值
- 如果它的右子樹(shù)不為空,那么右子樹(shù)上的左右結(jié)點(diǎn)的值均大于它的根結(jié)點(diǎn)的值
- 根結(jié)點(diǎn)的左子樹(shù)和右子樹(shù)又是二叉排序樹(shù)。
二叉排序樹(shù)通常采用二叉鏈表作為存儲(chǔ)結(jié)構(gòu)。
中序遍歷二叉排序樹(shù)便可得到一個(gè)遞增有序序列
。
一個(gè)無(wú)序序列可以通過(guò)構(gòu)造一棵二叉排序樹(shù)變成一個(gè)有序序列,構(gòu)造樹(shù)的過(guò)程即是對(duì)無(wú)序序列進(jìn)行排序的過(guò)程。
二叉排序樹(shù)的二叉鏈表存儲(chǔ)表示
typedef struct
{
KeyType key;
InfoType otherinfo;
}ElemType;
typedef struct BSTNode
{
ElemType data;
struct BSTNode *lchild,*rchild;
}BSTNode,*BSTree;
(1) 二叉排序樹(shù)的遞歸查找
- 若二叉排序樹(shù)為空,則查找失敗,返回空指針。
- 若二叉排序樹(shù)非空。將給定值key與根結(jié)點(diǎn)的關(guān)鍵字T->data.key進(jìn)行比較。
- 若key等于T->data.key,則查找 成功,返回根結(jié)點(diǎn)地址。
- 若key小于T->data.key,則遞歸查找左子樹(shù)。
- 若key大于T->data.key,則遞歸查找右子樹(shù)。
BSTree SearchBST(BSTree T, KeyType key)//遞歸算法
{
If((!T)|| key == T->data.key) return T;
else if(key < T->data.key) return SearchBST(T->lchild, key);
else return SearchBST(T->rchild, key);
}
(2) 二叉排序樹(shù)的插入
- 若二叉樹(shù)為空,則將待插入結(jié)點(diǎn)*S作為根結(jié)點(diǎn)插入到空樹(shù)。
2.若二叉排序樹(shù)非空,則將key與根結(jié)點(diǎn)的關(guān)鍵字 T->data.key進(jìn)行比較:
- 若key小于 T->data.key,則將*S插入左子樹(shù)。
- 若key大于 T->data.key,則將*S插入右子樹(shù)。
時(shí)間復(fù)雜度:插入一個(gè)節(jié)點(diǎn)算法的O(㏒2n),插入n個(gè)的總復(fù)雜度為O(n㏒2n)。
二叉排序樹(shù)插入的基本過(guò)程是查找,所以時(shí)間復(fù)雜度同查找一樣。
void InsertBST(BSTree &T,ElemType e)
{
if(!T)
{
S=new BSTNode;
S->data =e;
S->lchild = S->rchild =NULL;
}
else if(e.key < T->data.key) InsertBST(T->lchild,e);
else if(e.key > T->data.key) InsertBST(T->rchild,e);
}
(3) 二叉排序樹(shù)的創(chuàng)建
- 將二叉排序樹(shù)初始化為空樹(shù)。
2.讀入一個(gè)關(guān)鍵字為key的結(jié)點(diǎn)。- 如果讀入的關(guān)鍵字key不是輸入結(jié)束的標(biāo)志,則循環(huán)執(zhí)行以下操作:
- 將此結(jié)點(diǎn)插入二叉排序樹(shù)T中:
- 讀入一個(gè)關(guān)鍵字為key的結(jié)點(diǎn)。
void CreateBST(BSTree &T)
{
T=NULL;
cin >> e;
while(e.key != ENDFLAG)
{
InsertBST(T,e) ;
cin>>e;
}
}
(4)二叉排序樹(shù)的刪除
void DeleteBST(BSTree &T,KeyType key)
2.平衡二叉樹(shù)
(1) 左子樹(shù)和右子樹(shù)的深度之差的絕對(duì)值不超過(guò)1.
(2)左子樹(shù)和右子樹(shù)也是平衡二叉樹(shù)。
若將二叉樹(shù)上結(jié)點(diǎn)的平衡因子定義為該結(jié)點(diǎn)左子樹(shù)和右子樹(shù)的深度之差,則平衡二叉樹(shù)上所有結(jié)點(diǎn)的平衡因子只可能是-1、0和1。