資料結構與演算法分析(六) C 實現二叉查詢樹

2021-09-29 22:51:52 字數 3659 閱讀 4467

1.定義

二叉樹(binary tree)是一顆樹,其中每個節點都不能有多於兩個的兒子。

2.實現

每乙個節點用乙個結構體表示,包含乙個關鍵字和兩個指向左兒子和右兒子的指標。

3.遍歷方式

中序遍歷:左 節點 右

後序遍歷:左 右 節點

先序遍歷:節點 左 右

4.二叉查詢樹的概念

一顆二叉樹,對於每乙個節點x,它的左子樹中所有的關鍵字值都小於x的關鍵字值,它的右子樹中所有的關鍵字值都大於x的關鍵字值。

5.二叉查詢樹的性質

平均深度o(logn)

用到了很多的遞迴操作,且所有操作都需要傳入操作的節點(即可以對子樹進行操作)

1.清空樹

演算法實現步驟:

1.遞迴刪除左子樹

2.遞迴刪除右子樹

3.刪除該節點,返回乙個null指標(釋放記憶體後指標依舊指向該段記憶體,但是內容不確定了)

/**

*@name make_empty:遞迴刪除該節點以及該節點下所有的子樹

*@param1 t:指向該節點的指標

*@ret:將null返回給刪除的該節點

**/search_tree binary_tree::

make_empty

(search_tree t )

return t;

}

2.查詢最大(最小值)

演算法實現步驟:

1.由二叉查詢樹的結構決定,找到最左邊的葉(最小值),找到最右邊的葉(最大值)

2.這裡也利用遞迴去找,為最小值為例,直到找到的節點的左兒子為空時,將該節點返回

注:這裡在遞迴呼叫find_min時需要加return,否則從堆疊pop出來的時候就只有乙個ret,可能會出現問題

/**

*@name find_max:找到該節點的子樹中最大的那個值

*@param1 t:傳入的樹節點 如果要找整根樹中最大的值則輸入root

*@ret:指向存最大值的樹節點 為子樹中最右邊的葉

**/search_tree binary_tree::

find_max

(search_tree t)

else

}/**

*@name find_max:找到該節點的子樹中最小的那個值

*@param1 t:傳入的樹節點 如果要找整根樹中最小的值則輸入root

*@ret:指向存最大值的樹節點 為子樹中最左邊的葉

**/search_tree binary_tree::

find_min

(search_tree t)

if(t-

>left==

null

)else

}

3.查詢關鍵字匹配的節點

演算法實現步驟:

1.從某一節點向下,如果查詢的關鍵字大於該節點的關鍵字,到右子樹中遞迴查詢,如果查詢的關鍵字小於該節點的關鍵字,到左子樹中遞迴查詢。

2.如果遞迴到節點已空,則沒有找到;如果找到則返回該節點的位址。

注:在遞迴find_position前也要加return

/**

*@name find_position:查詢關鍵字所在的樹的節點

*@param1 data:需要匹配的關鍵字

*@param2 t:從哪乙個節點開始往下找 只會向下查詢

*@ret:指向匹配到關鍵字的節點的指標 沒有找到則返回null

**/search_tree binary_tree::

find_position

(int data,search_tree t)

//如果資料比該節點的關鍵字小的話,查詢去左子樹中查詢

if(t-

>data>data)

//如果資料比該節點的關鍵字大的話,查詢去右子樹中查詢

else

if(t-

>dataelse

}

4.插入節點

由於二叉查詢樹的結構,插入永遠會在葉上,故方便很多

演算法實現步驟:

1.根據新插入的節點的關鍵字大小,在給定節點的左子樹遞迴插入或右子樹遞迴插入

2.直到遞迴到空節點,new乙個節點,然後return該位址

3.最後返回插入完成了的給定節點的位址

/**

*@name insert:在樹的合適位置插入關鍵字為data的節點

*@param1 data:插入的資料

*@param2 t:在該節點的子樹中插入資料

**/search_tree binary_tree::

insert

(int data,search_tree t)

//插入的資料小於此時節點的資料,往左插(別忘了賦值給子左節點,指標形參改變不了傳入的引數,即雖然t->left新建了乙個節點,但此時只有形參指向它)

if(t-

>data>data)

//插入的資料大於此時節點的資料,往右插

else

if(t-

>data//如果插入的資料等於此時節點的資料,直接返回該節點

else

return t;

}

5.刪除某一關鍵字對應的節點

演算法實現步驟:

1.關鍵字小於給點節點關鍵字去左子樹刪,關鍵字大於給點節點關鍵字去右子樹刪。

2.如果關鍵字等於當前節點了分三種情況刪:

(1)當前節點為葉,直接delete,返回null;

(2)當前節點只掛一側有子樹,則先用定義中間指標變數temp指向該節點,然後delete當前節點,然後返回其右子樹;

(3)當前節點兩側都有子樹,則取出右子樹中的min節點,將此關鍵字賦給當前節點,然後遞迴刪除min節點;

3.如果找到空節點了還沒找到就報錯。

/**

*@name delete:刪除關節字為data的元素

*@param1 data:關鍵字

*@param2 t:從該節點以下的樹中刪除

**/search_tree binary_tree::

delete

(int data,search_tree t)

else

else

if(t-

>right==

null

)//此時的右兒子為空,只有左子樹

else

//此時既存在左子樹又存在右子樹}}

return t;

}

對遞迴和指標理解的還不夠,搞在一起就開始糊塗了。。。

注:為什麼這裡的形參指標不能改變傳入的指標的值?

解:1.改變形參指標指向的內容對傳入的指標毫無影響,因為呼叫完後就消失了

2.這裡由於遞迴帶來的混淆,我一直以為形參指標和傳入的指標指向的一直是同一塊記憶體,這裡舉最簡單的乙個例子,傳入的指標指向null,形參做出判斷,新建了一塊記憶體並指向它,而傳入的指標依舊是null。

資料結構與演算法分析 二叉查詢樹

class binarysearchtree comparable super anytype 節點初始化 建立乙個有兩個子樹的節點 binarynode anytype theelement,binarynode left,binarynode right 宣告根節點 private binary...

資料結構與演算法分析 二叉查詢樹

include include define elementtype int 節點資料型別 typedef struct treenode position typedef struct treenode searchtree struct treenode typedef struct treen...

資料結構與演算法 二叉堆

核心操作是sift up,和sift down,其他所有操作都是建立在這兩個核心操作的基礎上的,事實上所有的堆結構都可以使用這兩個操作。const int maxsize 10001 int size 0 int min heap maxsize 0號單元不使用,因為如果使用0單元,則k 2無法找到...