萌新筆記之二叉搜尋樹 BST

2021-07-24 15:46:33 字數 2105 閱讀 9504

前言,以前搞過線段樹,二叉樹覺得也就那樣= =、然後資料結構的課也沒怎麼聽過,然後下週期中考。。。

本來以為今天英語考完可以好好搞acm了,然後這個資料結構期中考感覺會丟人,還是好好學習一波。

二叉搜尋樹(bst,binary search tree)

又稱二叉排序樹或二叉查詢樹。

二叉搜尋樹 是一棵二叉樹,它可以為空。

特性(保證鍵值都不相同):

①:非空左子樹的所有鍵值都小於根節點的鍵值;

②:非空右子樹的所有鍵值都大於根節點的鍵值;

③:左右子樹都是bst;

二叉樹的遍歷方式中序,後序,前序不說了。。

直接說與bst操作相關的操作吧。。。。。。(自以為是由易到難的順序講的)

先小小地定義一下~

typedef

int elementtype;

//elementtype 就是 int 的意思(要問我啥意思呢。。。就是你看elementtype這個詞的意思:元素型別(是吧,我就看得懂type,前面瞎說是型別的意思,嘿嘿,平常用typedef就是為了偷懶。。)

typedef

struct tnode *position;

//這些小東西不多講了= =、指標不會就先去學指標,話說弱弱有乙個很不錯的指標講義。需要的可以聯絡。。

typedef position bintree;

struct tnode;

感覺插入就比較好理解???(三個反問號強行理解)

前面已經說過左右結點鍵值和根結點鍵值的關係,

通俗地講每次插入的時候比根的值小就放到左邊(左兒子)去,比他大放到右邊(右兒子)去;

細節方面還要考慮 這個bst是不是空的啊,還有以這個x值在這棵bst裡面有沒有啊;

bintree insert(bintree bst,elementtype x)

else

//額。。這個理解嘛。①:如果這棵bst就是空的,那麼你看直接建立,插然後返回,就是根節點對吧(這棵bst就乙個結點;②:如果不是空的,那麼就一直下去啊下去啊下去啊,搜到可以插的位置,插,返回的是插入結點。但是你可以看到中間的函式並沒有接什麼值,最後還是返回了根結點

return bst;

}

插入也是蠻好理解,還是利用特性嘛。

對於給定的元素,就去找就好啦。還是和根結點比較一下,比他小就看左邊,比他大就看右邊,找到就返回唄。

細節就是本身就是一棵空樹,那就直接返回空就好啦;

找到直接返回指標就好了;

position find(bintree bst , elementtype x)

這裡還有兩個操作查詢最小最大元素。

按照bst的特性我們就會知道,小的一直往左邊偏,大的一直往右邊偏。所以最小的就是最左邊那個啊,最大就是最右邊那個啊

查詢最小:

position findmin(bintree bst)

查詢最大:

position findmax(bintree bst)

1.如果待刪除的結點沒有孩子結點,那麼直接刪除就好了;

2.如果待刪除的結點只有乙個孩子結點,那麼讓孩子結點頂替他的位置;

3.如果待刪除的結點有兩個孩子結點,一種方法是拿左子樹的最大元素來頂替他的位置,另一種方法是拿右子樹的最小元素來頂替他的位置;

= =自己畫畫應該就懂了吧;

bintree delete(bintree bst,elementtype x)

if(x>bst->

data) //右子樹遞迴刪除

bst->right=delete(bst->right,x);

else

if(x

data) //左子樹遞迴刪除

bst->left=delete(bst->left,x);

else

//找到

else

//待刪除的結點沒有子結點或只有乙個

}return bst; //最後返回,傳下來的bst,因為一直都是遞迴啊~

}

二叉搜尋樹BST

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

二叉搜尋樹(BST)

二叉搜尋樹 bst bst 或者是一棵空樹,或者對於任何乙個結點,設其值為k,則該結點的左子樹的值小於k,右結點的值大於k。二叉搜尋樹按照中根遍歷將各個結點列印,將得到按照大到小的順序排列。bsg示意圖 二叉搜尋樹的效率在於檢索,將演算法複雜度從2 k減少到log n 檢索方式 從根結點開始,如果等...

BST二叉搜尋樹

深入學習理解bst include using namespace std typedef struct bitnodebitnode,bitree 二叉樹的插入操作 void insert bitnode root,int x 因為當對空樹插入時,相當於改變了樹的根節點的指向,因此需要用到指標或引...