二叉排序樹

2022-09-17 10:54:10 字數 2407 閱讀 5383

首先定義二叉樹的儲存結構

1

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

*/2 typedef char

treeelemtype;

3 typedef struct

tagbitreenode bitrnode, *bitrnodeptr;

二叉排序樹的查詢函式實現如下:

1/*2

** @brief 二叉排序樹查詢的遞迴實現

3** @param

4** @arg root : 根結點

5** @arg key : 待查詢的關鍵字

6** @arg parent: root節點的雙親結點,初始值為null

7** @arg result: 查詢結果中找到的結點指標

8** @retval 如果查詢成功,則result指向該元素結點並返回1;

9** 如果失敗,則result指向查詢路徑上訪問的最後乙個節點。

10*/

11int bst_search(bitrnodeptr root, treeelemtype key, bitrnodeptr parent, bitrnodeptr *result)

1217

if (key == root->data)else

if (key < root->data)else

25 }

在實現了查詢的基礎上,我們可以實現二叉查詢樹的插入(構造)函式:

1/*2

** @brief 二叉排序樹的插入

3** @retval 當二叉樹root中不存在關鍵字等於key的資料元素時,

4** 插入key並返回1;否則直接返回05*/

6int bst_insert(bitrnodeptr *root, treeelemtype key)

7else

if (key < result->data)else

2122

return

1;//

插入成功

23 }else

26 }

為了驗證,我們可以實現二叉樹的中序遍歷:

1/*2

** 中序遍歷二叉排序樹3*/

4void bst_tr**erse(bitrnodeptr root, void (*visit)(bitrnodeptr))

5

二叉排序樹的刪除操作相對複雜一點,**如下:

1/*2

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

4int deletenode(bitrnodeptr *p)

5else

if ((*p)->lchild == null)else

22//

找到p的直接前驅s

23 (*p)->data = s->data;//

用s的值替代待刪除結點的值

24if (q != (*p))else

29free(s);//

刪除前驅結點30}

31return1;

32}3334

/*35

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

36** 並返回1;如果不存在,則返回0

37*/

38int bst_delete(bitrnodeptr *root, treeelemtype key)

3943

44if ( key == (*root)->data )else

if ( key < (*root)->data )else

51 }

最後給一段測試**:

1 #include 2 #include "

search.h"3

4void

visit(bitrnodeptr e)58

9int main(void)10

19bst_tr**erse(root, visit);

2021 fflush(stdin);//

重新整理輸入緩衝區

22 printf("

\nenter key to be deleted: ");

23 scanf("

%c", &key);

24 bst_delete(&root, key);

25bst_tr**erse(root, visit);

2627

return0;

28 }

執行結果如下:

二叉排序樹

在複習資料結構,把這個東西總結一下。這種結構是動態查詢表,這種動態是相對靜態查詢 順序查詢,折半查詢,分塊查詢等 來說的。對於各種靜態鍊錶,要達到查詢複雜度為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 ...