C語言 資料結構與演算法 二叉排序(查詢)樹

2021-10-03 06:54:08 字數 3166 閱讀 6056

二叉排序樹(binary sort tree),又稱二叉查詢樹(binary search tree),亦稱二叉搜尋樹。它可以是一棵空樹。

特點:

與二叉樹相同:

typedef

struct binnode

binnode,

*bintree;

void

creattree

(bintree *t)

else

else

}}

在二叉排序樹不為空樹的前提下,首先將被查詢值同樹的根結點進行比較

bintree searchtree

(bintree t,

int key)

else if (t->data == key)

*///簡單寫法如下

//如果遞迴過程中 t 為空,則查詢結果,返回null;或者查詢成功,返回指向該關鍵字的指標if(

!t || t->data == key)

else

if(t->data > key)

else

if(t->data < key)

}

當因為查詢失敗而需要插入資料元素時,該資料元素的插入位置一定位於二叉排序樹的葉子結點,並且一定是查詢失敗時訪問的最後乙個結點的左孩子或者右孩子。

要完成插入操作,需要更改上述查詢函式:

//指標 f 指向父結點,初始化為 null

bool searchbst

(bitree t,

int key, bitree f, bitree *p)

else

if(key==t->data)

else

if(keydata)

else

}

插入:

bool inserttree

(bintree t,

int key)

else

if(key < p->data)

else

return true;

}//數中已有關鍵字相同的結點,不在插入

return false;

}

有了插入操作,就可以構建二叉排序樹:

int i,n;

bintree t =

null

;printf

("請輸入你想要新增資料的數目:\n");

scanf

("%d"

,&n)

;int

*a =

(int*)

malloc

(n*sizeof

(int))

;printf

("請依次輸入你想要新增的資料:\n");

for(i=

0;i)

也可以不依賴查詢函式,直接新增資料:

void

inserttree2

(bintree t,

int key)

//若找到則不新增

if(t->data == key)

if(t->data > key)

else

}

該結點為葉子結點,此時只需要刪除該結點,並修改其雙親結點的指標即可;

該結點左右子樹都不為空:

int

deletetree

(bintree* t,

int key)

else

else

if(key >

(*t)

->data)

else

//找到,開始刪除操作

//右孩子為空,重接左孩子

elseif(

(*p)

->rchild ==

null

)//左右孩子都不為空

else

(*p)

->data = s->data;

//此時的 s 指向被刪除結點直接前驅,此時的 p 是要刪除的那個結點,此時的 q 是 s 的雙親結點

if(q !=

*p)else

free

(s);}}

}

// t 為待刪除的結點

void

kill

(bintree* t)

//若無左子樹,重接右子樹

elseif(

!(*t)->lchild)

//若無右子樹,重接左子樹

elseif(

!(*t)->rchild)

//若左右子樹都有

else

//將該結點的右子樹接到前驅的後面-->前驅的右子樹

p->rchild =

(*t)

->rchild;

//將該結點的左子樹變成該結點雙親的左子樹

*t =

(*t)

->lchild;

free

(s);}}

//找出待刪除的結點

intdelete

(bintree* t,

int m)

//若找到待刪除的結點

elseif(

(*t)

->data == m)

elseif(

(*t)

->data > m)

elseif(

(*t)

->data < m)

}

最小值:

bintree findmin

(bintree t)

}return t;

}

最大值:

bintree findmax

(bintree t)

}return t;

}

//中序列印

void

printtree

(bintree t)

}

資料結構與演算法(C語言) 二叉排序樹

二叉排序樹的定義 二叉排序樹 binary sort tree 或者為空 或者是具有如下特性的二叉樹 1 若根的左子樹不空,則左子樹上所有結點的關鍵字均小於根結點的關鍵字 2 若根的右子樹不空,則右子樹上所有結點的關鍵字均大於根結點的關鍵字 3 根的左 右子樹也分別是二叉排序樹。一棵二叉排序樹的中序...

資料結構與演算法 二叉排序樹

如下 示例 package binarysorttree public class node override public string tostring 新增節點 public void add node node if node.value this.value else else else ...

資料結構與演算法 二叉樹高度(C語言)

求給定二叉樹的高度。函式介面定義 int getheight bintree bt 其中bintree結構定義如下 typedef struct tnode position typedef position bintree struct tnode 要求函式返回給定二叉樹bt的高度值。裁判測試程式...