#include
#include
#define ok 1
#define error 0
#define true 1
#define false 0
#define maxsize 100
/* 儲存空間初始分配量 */
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;
}
二叉排序樹
在複習資料結構,把這個東西總結一下。這種結構是動態查詢表,這種動態是相對靜態查詢 順序查詢,折半查詢,分塊查詢等 來說的。對於各種靜態鍊錶,要達到查詢複雜度為o logn 必須要求有序 而要使插入刪除複雜度為o 1 必須是鍊錶儲存。動態查詢表就可以同時滿足這兩者。動態查詢表的特點是表結構本身在查詢過...
二叉排序樹
name 二叉排序樹相關操作 author unimen date 2011 10 8 13 14 21 刪除結點比較麻煩,總結如下 4大種情況 1 結點p無右孩子 將該點的左孩子變為其在雙親中的同位孩子 1 p為其雙親的左孩子時將其的左孩子變為雙親的左孩子 2 p為其雙親的右孩子時將其的左孩子變為...
二叉排序樹
include include include include struct tree node void insert node struct tree node int void pre order struct tree node void in order struct tree node ...