二叉排序樹的基本操作
查詢操作
插入操作
刪除操作:注意對刪除節點的分類討論。當節點既有左子樹又有右子樹時,需要找到它的直接前驅(或直接後繼)對該節點進行替換,然後再刪除。
/* 儲存空間初始分配量 */
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 ...