查詢 二叉排序樹

2021-08-29 02:21:43 字數 2965 閱讀 8544

動態查詢表:表結構本身是在查詢過程中動態生成的,即對於給定值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...