14 查詢 二叉排序樹

2021-10-05 18:45:41 字數 2318 閱讀 7903

二叉排序樹的基本操作

查詢操作

插入操作

刪除操作:注意對刪除節點的分類討論。當節點既有左子樹又有右子樹時,需要找到它的直接前驅(或直接後繼)對該節點進行替換,然後再刪除。

/* 儲存空間初始分配量 */

typedef

int status;

/* status是函式的型別,其值是函式結果狀態**,如ok等 */

/* 二叉樹的二叉鍊錶結點結構定義 */

typedef

struct bitnode /* 結點結構 */

bitnode,

*bitree;

/* 遞迴查詢二叉排序樹t中是否存在key, */

/* 指標f指向t的雙親,其初始呼叫值為null */

/* 若查詢成功,則指標p指向該資料元素結點,並返回true */

/* 否則指標p指向查詢路徑上訪問的最後乙個結點並返回false */

status searchbst

(bitree t,

int key, bitree f, bitree *p)

else

if(key==t->data)

/* 查詢成功 */

else

if(keydata)

return

searchbst

(t->lchild, key, t, p)

;/* 在左子樹中繼續查詢 */

else

return

searchbst

(t->rchild, key, t, p)

;/* 在右子樹中繼續查詢 */

}/* 當二叉排序樹t中不存在關鍵字等於key的資料元素時, */

/* 插入key並返回true,否則返回false */

status insertbst

(bitree *t,

int key)

else

return false;

/* 樹中已有關鍵字相同的結點,不再插入 */

}/* 從二叉排序樹中刪除結點p,並重接它的左或右子樹。 */

status delete

(bitree *p)

elseif(

(*p)

->lchild==

null

)/* 只需重接它的右子樹 */

else

/* 左右子樹均不空 */

(*p)

->data=s->data;

/* s指向被刪結點的直接前驅(將被刪結點前驅的值取代被刪結點的值) */

if(q!=

*p) q->rchild=s->lchild;

/* 重接q的右子樹 */

else

q->lchild=s->lchild;

/* 重接q的左子樹 */

free

(s);

}return true;

}/* 若二叉排序樹t中存在關鍵字等於key的資料元素時,則刪除該資料元素結點, */

/* 並返回true;否則返回false。 */

status deletebst

(bitree *t,

int key)

}int

main

(void);

bitree t=

null

;for

(i=0

;i<

10;i++

)deletebst

(&t,93)

;deletebst

(&t,47)

;printf

("本樣例建議斷點跟蹤檢視二叉排序樹結構");

return0;

}

查詢 二叉排序樹

順序查詢 順序查詢又叫線性查詢,是最基本的查詢技術,它的查詢過程是 從表中第乙個記錄開始,逐個進行記錄的關鍵字和給定值比較,若某個記錄的關鍵字和給定值相等,則查詢成功,找到所查的記錄 如果知道最後乙個記錄,其關鍵字和給定值比較都不等時,則表中沒有所查的記錄,查詢不成功。順序查詢演算法實現 如下 順序...

查詢 二叉排序樹

動態查詢表 表結構本身是在查詢過程中動態生成的,即對於給定值key,若表中存在其關鍵值等於key的記錄,則查詢成功返回,否則插入關鍵字等於key的記錄。二叉排序樹或者是一顆空樹,或者是具有下列性質的二叉樹 1 若他的左子樹不為空,則左子樹上所有結點的值均小於它的根結點的值。2 若它的右子樹不空,則右...

Codeup二叉查詢樹 二叉排序樹

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