二叉排序樹(二叉查詢樹)的基本操作

2021-12-29 23:44:25 字數 2589 閱讀 1091

二叉排序樹的查詢屬於動態查詢的範疇,根據查詢過程中是否對錶進行修改,可以把查詢分為靜態查詢和動態查詢。動態查詢表的特點是:表結構本身是在查詢過程中動態生成的,即對於給定的key值,若表中存在其關鍵字等於key的記錄,則查詢成功並返回,否則插入關鍵字等於key的記錄。

二叉排序樹或者是一顆空樹,或者是具有下列性質的二叉樹:

(1)若它的左子樹非空,則左子樹上的所有結點的值均小於根節點的值;

(2)若它的右子樹非空,則右子樹上的所有結點的值均大於根節點的值;

(3)它的左右子樹也分別為二叉排序樹;

1、二叉排序樹的資料結構

typedef struct node

bstnode,*bstree;

2、二叉排序樹的插入和生成

已知乙個關鍵字值為key的節點s,若將其插入到二叉排序樹中,只要保證插入後仍符合二叉排序樹的定義即可,插入可以用一下方法。

(1)若二叉排序樹為空樹,則key稱為二叉排序樹的根;

(2)若二叉排序樹非空,則將key與二叉排序樹的根比較,如果key值等於根節點,則停止插入;如果key值小於根節點的值,則將key插入左子樹;如果key值大於根節點的值,則將key插入右子樹;

二叉樹的插入演算法如下:

void insertbst(bstree* bst,short key)

else if(keykey)

else if(key>(*bst)->key)

}/******************

* 根據二叉排序樹的插入演算法可以建立一顆二叉排序樹;

****************************/

void createbst(bstree* bst)

}3、二叉排序樹的刪除在二叉排序樹中刪除乙個結點比插入乙個結點要困難,除非是葉子結點,否則必須考慮部分鏈的對接,以保證刪除乙個結點後能使剩下的結點仍是一顆二叉排序樹。

假設要刪除的結點為p,其雙親結點為f,且不失一般性,並設結點p是結點f的左孩子(右孩子情況類似)。如下圖所示:(注:下圖截至資料結構書中)。

下面分三種情況進行討論:

(1)若p為葉子節點,刪除p後只需修改雙親節點的指標即可;

(2)如果p的左子樹為空或者p的右子樹為空,此時只需令其左右子樹pl,pr成為其雙親結點f的左右子樹即可;

(3)若p的左右子樹均不為空,如圖8.7(a)所示:此時有兩種處理方法。

方法1:首先找到p結點在中序序列中的直接前驅s結點,如圖8.7(b)所示,然後將p的左子樹改為f的左子樹,p的右子樹改為s的右子樹;

f->lchild=p->lchild;s->rchild=p->rchild;free(p);結果如圖8.7(c)所示:因為p的右結點數值比s的數值大,故不會改變二叉排序樹的性質;

方法2:首先找到p結點在中序序列中的直接前驅s結點,如圖8.7(b)所示,然後用s結點的值代替p結點的值,再將s結點刪除,原s結點的左子樹改為雙親

結點q結點的右子樹;p->data=s->data;q->rchild=s->lchild;free(s)。結果如圖8.7(d)所示。

具體演算法描述如下:

void delbst(bstree *t,short key)

f=p; //f指向p節點的雙親節點;

if(p->key>key)

else

}if(p==null) //如果沒有找到直接返回;

if(f==null) //如果p是原二叉排序樹的根;

if(p->lchild==null&&p->rchild==null) //如果p沒有左右子樹;

else

free(p);

} else if(p->lchild==null&&p->rchild!=null) //如果p的左子樹為空,右子樹不為空;

else

free(p);

} else if(p->lchild!=null&&p->rchild==null) //如果p的左子樹不為空,右子樹為空;

else

free(p);

} else if(p->lchild!=null&&p->rchild!=null) //如果p的左右子樹都不為空;

p->key=s->key; //把s節點的資料賦值給p節點;

if(p==q) //說明待刪除的p節點的左子節點下沒有右結點;

else

free(s);

}}4.二叉排序樹的查詢由二叉排序樹的定義可知,在二叉排序樹上進行查詢與二分查詢類似。即:當二叉排序樹不為空時,首先將給定值與根結點的關鍵值相比較,若相等,則查詢成功。否則,將依據給定值和根節點關鍵值之間的大小關係,分別在左右子樹上繼續進行查詢,其查詢過程的演算法如下:

bstree searchbst(bstree bst,short key)

if(bst->key==key)

else if(bst->key>key)

else

}5、二叉排序樹的查詢分析

二叉排序樹 二叉搜尋樹 二叉查詢樹

特點 結構體定義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...

二叉排序樹(二叉查詢樹 二叉搜尋樹)

include include typedef struct node node node createnode int value void addnode node root,int value else else void middleorder node node middleoder no...

Codeup二叉查詢樹 二叉排序樹

輸入一系列整數,建立二叉排序數,並進行前序,中序,後序遍歷。輸入第一行包括乙個整數n 1 n 100 接下來的一行包括n個整數。可能有多組測試資料,對於每組資料,將題目所給資料建立乙個二叉排序樹,並對二叉排序樹進行前序 中序和後序遍歷。每種遍歷結果輸出一行。每行最後乙個資料之後有乙個空格。12 2 ...