順序儲存結構--將二叉樹按層序依次存入陣列中
已知乙個節點在陣列中序號為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...