動態查詢表:表結構本身是在查詢過程中動態生成的,即對於給定值key,若表中存在其關鍵值等於key的記錄,則查詢成功返回,否則插入關鍵字等於key的記錄。
二叉排序樹或者是一顆空樹,或者是具有下列性質的二叉樹:
1、若他的左子樹不為空,則左子樹上所有結點的值均小於它的根結點的值。
2、若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
3、它的左右子樹也分別為二叉排序樹。
二叉排序樹又稱二叉查詢樹,根據上述定義的結構特點可見,它的查詢過程與次優二叉樹類似,即當二叉排序樹不空時,首先將給定值和根結點的關鍵字比較,若相等,則查詢成功,否則將根據給定值和根結點的關鍵字之間的大小關係,分別在左子樹或右子樹上繼續進行查詢。通常,可取二叉鍊錶作為二叉排序樹的儲存結構。
首先是輔助巨集的定義:
#define ok 1
#define error 0
#define true 1
#define false 0
#define overflow -1
#define underflow -2
#define null 0
#define lh 1 //左高
#define eh 0 //等高
#define rh -1 //右高
typedef int status;
typedef int keytype;
typedef char* infotype;
二叉排序樹的儲存結構定義:
//二叉排序樹的儲存結構定義
typedef structelemtype;
typedef struct bitnodebitnode,*bitree;
typedef bitnode bstnode;
typedef bitree bstree;
查詢(遞迴實現):
演算法思想:
若為空,返回null。
不空時,
若查詢的關鍵字等於跟結點,返回t;
否則若小於根,查其左子樹,返回查詢結果;
若大於根,查其右子樹,返回查詢結果;
bstree searchbst(bstree t,keytype key)
查詢(非遞迴實現):
p最初指向根結點,只要p不空且p所指結點不是所求則根據比較結果令p變為當前結點的左孩子或右孩子。
如此重複直到p空或者找到。
bstnode *search(bstree t,keytype key)
return p;
}
判斷一顆給定二叉樹是否是二叉排序樹。
運用遞迴的思想,空樹是二叉排序樹;當樹不空時,先判斷左右子樹是否是二叉排序樹,只要有乙個不是則原樹不是二叉排序樹,如果左右子樹都是二叉排序樹,看看左子樹中最大的是否比根結點小,右子樹中最小的是否比根結點大即可。
status isbst(bstree &t)
if(t->rchild)
return true;
}}
二叉排序樹的插入.
若二叉排序樹為空,則插入結點應為根結點。
否則,在已有二叉排序樹中查詢是否存在相等結點。
若樹中已有,不再插入。
若樹中沒有,則查詢過程中必然會落空,該落空的位置就是新結點應該在的位置。
插入的過程與查詢基本類似。新插入的結點一定在葉結點上。
status insertbst(bstree &t,keytype key)
else if(key==t->data.key)
return error;
else if(keydata.key)
return insertbst(t->lchild,key);
else
return insertbst(t->rchild,key);
}
二叉排序樹的建立:
從空樹出發,依次按照結點插入方法插入各結點。
status createbst(bstree &t)
return ok;
}
二叉排序樹的刪除:
首先定位被刪除的結點及其雙親,如果不存在關鍵字等於key的結點,則直接返回。
否則,根據被刪結點特性分類處理,保證刪除後仍是二叉排序樹。
1、被刪除的結點是葉子結點。若有雙親則將雙親結點中相應指標域的值置空,否則t置空。
2、被刪結點只有左子樹或右子樹。雙親結點相應指標指向被刪結點的唯一子樹。
3、被刪結點既有左子樹也有右子樹。找左子樹最大的元素代替被刪除元素,歸結為前一情況。
void deletebft(bstree &t,keytype key)
else
}if(!p)
return;
if(!p->lchild&&!p->rchild)
else if(f->lchild==p)
f->lchild=null;
else
f->rchild=null;
free(p);
p=null;
}else if(!p->lchild)
else if(!p->rchild)
else
p->data.key=q->data.key; //左子樹最大者的值填充到原本被刪結點
if(f->lchild==q) //刪除左子樹中最大者
f->lchild=q->lchild;
else
f->rchild=q->lchild;
free(q);
q=null;
}}
二叉排序樹查詢的效能分析:
平均查詢長度和二叉樹的形態有關,即,
最好 logn。形態均勻,與二分查詢的判定樹相似。
最壞:(n+1)/2
查詢 二叉排序樹
順序查詢 順序查詢又叫線性查詢,是最基本的查詢技術,它的查詢過程是 從表中第乙個記錄開始,逐個進行記錄的關鍵字和給定值比較,若某個記錄的關鍵字和給定值相等,則查詢成功,找到所查的記錄 如果知道最後乙個記錄,其關鍵字和給定值比較都不等時,則表中沒有所查的記錄,查詢不成功。順序查詢演算法實現 如下 順序...
Codeup二叉查詢樹 二叉排序樹
輸入一系列整數,建立二叉排序數,並進行前序,中序,後序遍歷。輸入第一行包括乙個整數n 1 n 100 接下來的一行包括n個整數。可能有多組測試資料,對於每組資料,將題目所給資料建立乙個二叉排序樹,並對二叉排序樹進行前序 中序和後序遍歷。每種遍歷結果輸出一行。每行最後乙個資料之後有乙個空格。12 2 ...
二叉排序樹 二叉搜尋樹 二叉查詢樹
特點 結構體定義struct node 建樹 建二叉排序樹 void create node root,int t else if t root data create root lc,t else create root rc,t 前序遍歷 層序 字典序 int flag int pre 1001...