【正文】
9 8 5 1 1 4 0 1 1 0 5 2 1 9 9 1 9 9 3 1 0 2 4 2 0 1 0 2 0 4 8 ]l o w k e y = 2 0 1 0h i g hm i d[ 9 8 5 1 1 4 0 1 1 0 5 2 1 9 9 1 9 9 3 1 0 2 4 2 0 1 0 2 0 4 8 ]l o wm i d = = k e y = 2 0 1 0h i g hm i d第 二 趟 比 較 , l o w 將 移 到 m i d + 1 的 位 置第 三 趟 比 較 , 找 到 所 查 元 素 例如,有如下有序序列array[10]={985, 114, 0,110, 521, 991, 993, 1024,2022, 2048},要查找關(guān)鍵元素 2022,則首先需要定位序列的中間位置,然后進(jìn)一步判斷是否需要進(jìn)行下一步查找,如圖所示為折半查找過程。 //返回查找到的位置 10 } 11 else if(InputTable[mid]KeyParameter) //判斷當(dāng)前位置大于或小于要查找元素 12 { 13 high = mid1。二叉樹在數(shù)據(jù)庫系統(tǒng)和計(jì)算機(jī)語法結(jié)構(gòu)設(shè)計(jì)中應(yīng)用廣泛,此外,數(shù)據(jù)序列的排序和查找也廣泛應(yīng)用二叉樹結(jié)構(gòu)設(shè)計(jì)。對(duì)于任何一個(gè)包含 n個(gè)結(jié)點(diǎn)的非空樹,都有如下特點(diǎn): 1)有且僅有一個(gè)稱為根的結(jié)點(diǎn)( root) 2)若 n1,則剩余結(jié)點(diǎn)被可以被分成 m個(gè)互不相交的集合 TreeTree Tree …… Treem,這些集合被稱為子樹( SubTree)。 AB CABABABCD E FG( a ) ( b ) ( c ) ( d )( a )右 子 樹 為 空 的 二 叉 樹( b )三 個(gè) 結(jié) 點(diǎn) 的 滿 二 叉 樹( c )七 個(gè) 結(jié) 點(diǎn) 的 滿 二 叉 樹( d )左 子 樹 為 空 的 二 叉 樹 C語言實(shí)現(xiàn)簡單的二叉樹 ? 1.二叉樹結(jié)點(diǎn)的存儲(chǔ)結(jié)構(gòu) 二叉樹結(jié)點(diǎn)至少需要三個(gè)向其他結(jié)點(diǎn)的索引才能滿足整個(gè)二叉樹的結(jié)構(gòu)。 //指向雙親結(jié)點(diǎn) 04 int data。 C語言實(shí)現(xiàn)簡單的二叉樹 ? 2. C語言分配二叉樹內(nèi)存 二叉樹的所有結(jié)點(diǎn)在內(nèi)存中都連續(xù)存放,因此,可以動(dòng)態(tài)分配一定的連續(xù)內(nèi)存空間用以建立二叉樹,也可以定義結(jié)構(gòu)體數(shù)組用于構(gòu)建二叉樹。另外,也可以動(dòng)態(tài)分配一定的內(nèi)存空間,用于構(gòu)建二叉樹,可以使用下面的代碼: struct TreeNode *pBinTree=NULL。 I n B i n T r e e [ 0 ]I n B i n T r e e [ 1 ]I n B i n T r e e [ 2 ]I n B i n T r e e [ 3 ]I n B i n T r e e [ 4 ]I n B i n T r e e [ 5 ]I n B i n T r e e [ 6 ]ABCD E FGABCDEFG( a ) 二 叉 樹 結(jié) 構(gòu) ( b ) 二 叉 樹 與 內(nèi) 存 映 射 C語言實(shí)現(xiàn)簡單的二叉樹 ? 4.驗(yàn)證二叉樹是否為空 二叉樹使用前應(yīng)先判斷是否為空,若為空,則不能繼續(xù)對(duì)二叉樹進(jìn)行任何操作。 11 return 1。先序遍歷的基本代碼如下: 01 void preOrderTreversingTree(struct TreeNode *InBinTree) 02 { 03 if(NULL= =InBinTree) 04 { 05 printf(“輸入?yún)?shù)錯(cuò)誤,返回 \n”)。//先序遍歷左子樹 12 preOrderTreversingTree(InBinTreerightchild)。中序遍歷的基本代碼如下: 01 void MidOrderTreversingTree(struct TreeNode *InBinTree) 02 { 03 if(NULL= =InBinTree) 04 { 05 printf(“輸入?yún)?shù)錯(cuò)誤,返回 \n”)。 //訪問根結(jié)點(diǎn) 12 MidOrderTreversingTree(InBinTreerightchild)。后序遍歷的基本代碼如下: 01 void LastOrderTreversingTree(struct TreeNode *InBinTree) 02 { 03 if(NULL= =InBinTree) 04 { 05 printf(“輸入?yún)?shù)錯(cuò)誤,返回 \n”)。//后序遍歷右子樹 12 printf( %d, InBinTreedata)。 04 printf(開始處理函數(shù) SearchBinTree()\n)。 15 } 16 else 17 {/* 分別向左右子樹遞歸查找 */ 18 if(pTree = SearchBinTree(InBinTreeleftchild, Indata)) //遍歷左子樹 19 { 20 return pTree。 28 } 29 } 30 } 二叉樹的簡單操作 ? 5.二叉樹中插入一個(gè)結(jié)點(diǎn) 向二叉樹中插入結(jié)點(diǎn)時(shí)應(yīng)考慮二叉樹的有序性,即在不破壞二叉樹的有序性的前提下插入一個(gè)新的結(jié)點(diǎn),若二叉樹為空,則新建一個(gè)結(jié)點(diǎn),構(gòu)成一個(gè)僅有一個(gè)結(jié)點(diǎn)的二叉樹。 08 pNoderightchild=NULL。 //向左子樹中插入該結(jié)點(diǎn) 15 } 16 else 17 { 18 InsertBinTree(InBinTreerightchild,NewData)。當(dāng)二叉樹根結(jié)點(diǎn)為要?jiǎng)h除的結(jié)點(diǎn)且右子樹為空時(shí),直接刪除根結(jié)點(diǎn),將左子樹作為保留二叉樹。將這兩個(gè)數(shù)組合并成一個(gè)有序數(shù)組,并將其放在 arrayMerge里。 i3 8 1 0 9 3 2 8 1 0 1a r r a y 1a r r a y M e r g eja r r a y 2 3k+ ++ +實(shí)訓(xùn) ——合并兩個(gè)有序數(shù)組 進(jìn)行第一次比較之后,將 array2中的值 3插入數(shù)組 arrayMerge中,下標(biāo) j和 k分別將指向下一個(gè)元素,然后重新進(jìn)行比較,