BST樹 二叉搜尋(排序)樹

2021-10-14 16:42:07 字數 3406 閱讀 7903

bst樹的定義:

二叉搜尋樹或者是一顆空樹,或者是具有下列性質的二叉樹:

1.每個節點都有乙個作為搜尋依據的關鍵碼(key),所有節點的關鍵碼都互不相同。

2.左子樹(如果存在)上所有節點的關鍵碼都小於根節點的關鍵碼

3.右子樹(如果存在)上所有節點的關鍵碼都大於根節點的關鍵碼。

4.左子樹和右子樹也是二叉搜尋樹

如圖下面這棵樹就是一顆二叉排序樹:

通過上述定義我們不難得出下面這個結論:

如果對一顆二叉搜尋樹進行中序遍歷,可以按照從小到大的順序,將各節點關鍵碼排列起來,所以也稱二叉搜尋樹為二叉排序樹。

首先我們給出二叉搜尋樹的結構:

typedef

int elemtype;

typedef

struct bstnode

btnode;

typedef

struct

bstree;

首先,當這個二叉搜尋樹是一顆空樹的時候,程式設計師需要進行節點的申請,也就是說它所佔的空間的申請:

struct bstnode*

buynode()

以及對空間(記憶體)的釋放:

void

freenode

(bstnode* p)

對二叉搜尋樹進行初始化:

void

init_tree

(bstree & mytree)

查詢某個資料域為x的節點應該插入到哪個位置:

bstnode*

findvalue

(bstree& mytree, elemtype x)

return p;

//返回資料域為x的這個節點

}

給二叉搜尋樹中插入乙個節點:

void

insert_tree

(bstree& mytree, elemtype val)

if(p !=

null

&& p->data == val)

return

; p =

buynode()

; p->data = val;

p->parent = pa;

if(pa ==

null

)else

else

} mytree.cursize +=1

;}

二叉搜尋樹的中序遍歷:

void

inorder

(bstnode* ptr)

}

找二叉搜尋樹的最小值(最左邊的值)

btnode*

first

(btnode* ptr)

return ptr;

}

找二叉搜尋樹的最大值(最右邊的值)

btnode*

last

(btnode* ptr)

return ptr;

}

找二叉搜尋樹的某個節點的後繼節點:

bstnode*

next

(bstnode* ptr)

else

return pa;

}}

找二叉搜尋樹的前驅節點:

bstnode*

prov

(bstnode* ptr)

else

return pa;

}}

二叉搜尋樹的非遞迴遍歷:

void

niceinorder

(bstree &mytree)

cout << endl;

}

二叉搜尋樹的非遞迴逆序遍歷:

void

reniceinorder

(bstree& mytree)

cout << endl;

}

按值刪除二叉搜尋樹中的節點;

bool remove_value

(bstree& mytree,elemtype val)

//leaf

bstnode* pa = p->parent;

bstnode* child = p->leftchild !=

null

? p->leftchild : p->rightchild;

if(child !=

null

)child->parent = pa;

if(pa ==

null

)else

if(pa->rightchild == p)

}freenode

(p);

mytree.cursize -=1

;return true;

}

主函式**如下所示:

int

main()

;int n =

sizeof

(arr)

/sizeof

(arr[0]

);bstree mytree;

init_tree

(mytree)

;for

(int i =

0; i < n; i++

)inorder

(mytree.root)

; cout << endl;

niceinorder

(mytree)

; cout << endl;

reniceinorder

(mytree)

; cout << endl;

remove_value

(mytree,88)

;inorder

(mytree.root)

; cout << endl;

destroy_tree

(mytree)

;return0;

}

最終執行結果如下所示:

二叉搜尋樹(二叉排序樹)BST

定義 每個節點至多有兩個孩子結點,且子樹有左右序之分,左子樹的鍵值永遠比右子樹小,並且小於根鍵值,且沒有鍵值相等的結點。操作 插入 查詢操作注意左右鍵值大小這一特點。刪除操作是重點,若沒有子結點或只有乙個子結點很好處理,若有兩個子結點,刪除父結點誰來繼位?找到左子樹中鍵值最大的點!用它來代替被刪除結...

樹 二叉搜尋樹 bst

二叉搜尋樹 定義 二叉搜尋樹 bst 也稱二叉排序樹或二叉查詢樹 二叉搜尋樹 一棵二叉樹,可以為空 如果不為空,滿足以下性質 非空左子樹的所有鍵值小於其根結點的鍵值 非空右子樹的所有鍵值大於其根結點的鍵值 左 右子樹都是二叉搜尋樹 特殊函式 bintree find elementtype x,bi...

二叉搜尋樹BST

在二叉搜尋樹b中查詢x的過程為 1.若b是空樹,則搜尋失敗,否則 2.若x等於b的根結點的資料域之值,則查詢成功 否則 3.若x小於b的根結點的資料域之值,則搜尋左子樹 否則 4.查詢右子樹 指標parent指向proot的父節點,其初始呼叫值為null 若查詢成功,指標ptarget指向目標節點,...