二叉樹的順序結構C語言實現

2021-06-22 17:43:32 字數 2729 閱讀 1445

順序儲存結構--將二叉樹按層序依次存入陣列中

已知乙個節點在陣列中序號為i,則該節點的

雙親節點序號為:((i+1)/2)-1

左孩子:         2*i+1

右孩子:         2*i+2

**實現關鍵點:

1.建立二叉樹createbitree():按層次順序輸入二叉樹中節點的值

1)對非空無雙親的非根節點的判斷   if(i!=0&&t[(i+1)/2-1]==0&&t[i]!=0)

非根節點--i!=0;無雙親--t[(i+1)/2-1]=nil;非空--t[i]=nil

此種節點的存在不合理:除根節點外,其他非空節點都有雙親節點。如果出現 非根,非空,但又沒有雙親的節點,

則該該節點不合法。

2.得到二叉樹的深度bitreedepth

先得到節點數,然後利用二叉樹性質2(深度為k的二叉樹至多有(2^k)-1個節點)得到深度。

3.assign()給處於位置(level,order)的節點賦值。(level,order)表示(層,層序),從左到右

因為二叉樹第k層最多有2^(k-1)個節點,所以有對賦值節點位置越界的判斷

if(level>bitreedepth(t)||order>(int)powl(2,level-1))

int pos = (int)powl(2,e.level-1)+e.order-2 ---將(level,order)轉化為節點在陣列的位置

兩種不合法賦值判斷:1).給葉子賦值,但是雙親為空;2).給雙親賦空值,但是其有葉子節點(非空)

1)---if(value!=nil&&t[(pos+1)/2-1]==nil)

2)---if(value==nil&&(t[pos*2+1]!=nil||t[pos*2+2]!=nil))

3.rightsibling返回節點e的右兄弟,否則返回空

if(t[i]==e&&i%2!=0)---找到e,且i為奇數--左孩子,則其右兄弟為t[i+1]

4.三種遍歷:先序,中序,後序

三者在**上沒有太大區別,只是反問區域性根節點的順序分別為:左根右、根左右、左右根

判斷是否為左孩子:if(t[2*i+1]!=nil)

判斷是否為右孩子:if(t[2*i+2]!=nil)

**(站在巨人的肩膀上)

#include #include #include #include #define ok 1

#define error 0

#define true 1

#define false 0

#define maxsize 100

#define max_tree_size 100

typedef int status;

typedef int telemtype;

typedef telemtype sqbitree[max_tree_size];//將sqbitree定義為元素telemtype的陣列

typedef struct

position;

telemtype nil = 0;//nil表示無值,是object-c,ruby,lua中的關鍵字

//建立空樹,此處樹中每個節點都為0

status initbitree(sqbitree t)

} i++; //節點數

while(i>=powl(2,j)) //二叉樹性質:深度為k的二叉樹至多有(2^k)-1個節點

return j;

}//初始條件:二叉樹存在

//操作結果:得到根節點,並用e返回根,返回ok;否則返回error

status root(sqbitree t,telemtype *e)

else }

//初始條件:二叉樹存在

//操作結果:返回指定節點的值,沒有則返回error;position(層,本層序號)確定節點位置

telemtype value(sqbitree t,position e)

if(0==t[0])

if(e.level>bitreedepth(t)||e.order>(int)powl(2,e.level-1))//節點不存在

int pos = (int)powl(2,e.level-1)+e.order-2;//根據e確定節點在陣列中的位置

return t[pos];

}//初始條件:二叉樹存在

//操作處理:給處於e的樹t的節點賦值value,沒有則返回error

status assign(sqbitree t,position e,telemtype value)

if(e.level>bitreedepth(t)||e.order>(int)powl(2,e.level-1))//位置越界

int pos = (int)powl(2,e.level-1)+e.order-2; //將position轉化為節點在陣列的位置

if(value!=nil&&t[(pos+1)/2-1]==nil)//給葉子賦值,但是雙親為空

else if(value==nil&&(t[pos*2+1]!=nil||t[pos*2+2]!=nil))//給雙親賦空值,但是有葉子節點(不空)

t[pos] = value;

return ok;

}//初始條件:二叉樹存在

//操作處理:返回非根節點e的雙親節點,沒有則返回「空」

telemtype parent(sqbitree t,telemtype e)

int i;

for(i=0;i

C語言實現二叉樹

1.c語言實現二叉樹中節點間最大距離 includetypedef struct treenode treenode 我們可以將所有的結點的左右子樹的高度和計算一下,然後取出最大值,就是最遠的距離。int getmaxdistance treenode root,int maxdistance in...

二叉樹(C語言實現)

以下為用c語言實現的二叉排序樹,包含了樹的建立,銷毀,新增,刪除,修改,前 中 後 層序遍歷,深度,密度。include include include define type int typedef struct node node 建立結點 node creat node type data 新...

c語言實現二叉樹資料結構

要實現任意一種資料結構,首先要考慮組成該資料結構的基本元素。二叉樹的基本組成元素是結點 又根據二叉樹的性質,每個結點都可以看成由資料項 指向左子樹的指標和指向右子樹的指標組成。二叉樹的操作要充分考慮遞迴的運用。include include 二叉樹的資料結構 typedef struct bnode...