資料結構 二叉檢索樹的C 實現

2021-10-01 15:43:46 字數 2905 閱讀 1491

定義

二叉檢索樹或者是一棵空樹,或者是具有下列性質的二叉樹: 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 它的左、右子樹也分別為二叉檢索樹。又稱二叉搜尋樹,二叉排序樹。

結點的實現

template

<

typename key,

typename e>

struct bstnode

void

setleft

(node* t)

void

setright

(node* t)

};

基本操作

//e為數值的資料型別,key為鍵值的資料型別 

e*find

(const key& k)

e*findhelp

(node* t,

const key& k)

要插入乙個值,首先要明確它應該被插到什麼地方。遞迴查詢它應該被插入的地方,最終達到乙個葉結點或在待插入方向上沒有子節點的分支結點。最後將該值插進去。

void

insert

(const key& k,

const e& v)

node*

inserthelp

(node* t,

const key& k,

const e& v)

node*

deletemin

(node* t)

}

還可以根據這個性質來找到最小鍵值結點

node*

getmin

(node* t)

接下來就考慮如何刪除任一結點了。首先找到這一節點,

如果它沒有子節點,就將它的父節點指向它的指標設為空指標。

如果它有乙個子節點,那麼將它的父節點指向它的指標改為指向它的子節點的指標。

如果它有兩個子節點,較好的做法是從它的子樹中找到乙個可以替代它的值。為了保持二叉檢索樹的性質,我們應該選擇大於等於被替換值的最小值或小於等於它的最大值。即左子樹中值最大的結點或右子樹中值最小的結點。由於我們在建立二叉檢索樹時,大於等於結點的值都在結點的右子樹,故我們最好選擇右子樹的最小值。否則樹的性質就會發生改變。

void

remove

(const key& k)

node*

removehelp

(node* t,

const key& k)

//右子樹為空的情況

else

if(t-

>right ==

nullptr

)else

}//放hi新的根節點

return t;

}

#include

#include

#include

#define safe_delete(p) if(p)

using

namespace std;

template

<

typename key,

typename e>

struct bstnode

void

setleft

(node* t)

void

setright

(node* t)};

template

<

typename key,

typename e>

class

bst node*

deletemin

(node* t)

} node*

getmin

(node* t)

node*

removehelp

(node* t,

const key& k)

else

if(t-

>right ==

nullptr

)else

}return t;

} e*

findhelp

(node* t,

const key& k)

void

clearhelp

(node* t)

void

printhelp

(node* t,

int dep)

public

:bst()

~bst()

void

clear()

void

insert

(const key& k,

const e& v)

void

remove

(const key& k)

e*find

(const key& k)

intsize()

const

void

print()

};intmain

(int argc,

char

** ar**)

t.print()

;scanf

("%d"

,&a)

;int

*x = t.

find

(a);

if(x !=

nullptr

) cout <<

*x << endl;

safe_delete

(x);

t.clear()

;return0;

}

資料結構C 實現 二叉樹

adt btree btnode const t x btnode const t x,btnode l,btnode r 三個資料成員 t element btnode lchild,rchild 二叉樹類包含唯一的資料成員,它是指向乙個二叉鍊錶根結點的指標root 二叉樹類 先建立二叉樹結點類 ...

資料結構的C實現 二叉樹

二叉樹及其遞迴和非遞迴遍歷 include include define maxkey 100 define ok 1 typedef char elemtype typedef struct node node 二叉樹節點 遞迴先序遍歷 void preorder r node tree 遞迴中序...

資料結構 二叉樹的實現(C )

mi tree測試資料 mi tree實現 include stdafx.h include using namespace std 二叉樹 遞迴實現的二叉樹。萬能的遞迴。class mi tree element pleft element pright char data public mi t...