02二叉排序樹 BinarySortTree

2021-10-10 01:50:22 字數 1930 閱讀 5463

#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 ...