二叉樹的順序儲存結構

2022-08-29 12:21:16 字數 3135 閱讀 5696

// c6-1.h 二叉樹的順序儲存結構(見圖6.1)

#define max_tree_size 100 // 二叉樹的最大結點數

typedef telemtype sqbitree[max_tree_size]; // 0號單元儲存根結點

struct position

;

在順序儲存結構中,如圖62 所示,第i 層結點的序號從2i1 -1~2i-2;序號為i 的結

點,其雙親序號為(i+1)/2-1,其左右孩子序號分別為2i+1 和2i+2;除了根結點,序號為

奇數的結點是其雙親的左孩子,它的右兄弟的序號是它的序號+1;序號為偶數的結點是其

雙親的右孩子,它的左兄弟的序號是它的序號-1;i 層的滿二叉樹,其結點總數為2i-1。

顯然,在順序儲存結構中,按層序輸入二叉樹是最方便的。當最後乙個結點的值輸入

後,輸入給定符號表示結束。二叉樹的順序儲存結構適合存完全二叉樹或近似完全二

叉樹。bo6-1.cpp 是採用順序儲存結構的基本操作程式,main6-1.cpp 是檢驗這些基本操作的

主程式。為了使這兩個程式在結點型別為整型和字元型時都能使用,採用了編譯預處理的

「#define」、「#if」等命令。這樣,只要將main6-1.cpp 的第2 行或第3 行改為注釋行

即可。

// bo6-1.cpp 二叉樹的順序儲存(儲存結構由c6-1.h定義)的基本操作(23個)

#define clearbitree initbitree // 在順序儲存結構中,兩函式完全一樣

#define destroybitree initbitree // 在順序儲存結構中,兩函式完全一樣

void initbitree(sqbitree t)

i++;

}#endif

for(i=1;i=0;i--) // 找到最後乙個結點

if(t[i]!=nil)

break;

i++; // 為了便於計算

doj++;

while(i>=pow(2,j));

return j;

}status root(sqbitree t,telemtype &e)

}telemtype value(sqbitree t,position e)

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

telemtype parent(sqbitree t,telemtype e)

telemtype leftchild(sqbitree t,telemtype e)

telemtype rightchild(sqbitree t,telemtype e)

telemtype leftsibling(sqbitree t,telemtype e)

telemtype rightsibling(sqbitree t,telemtype e)

void move(sqbitree q,int j,sqbitree t,int i) // insertchild()用到。加

void insertchild(sqbitree t,telemtype p,int lr,sqbitree c)

{ //初始條件:二叉樹t存在,p是t中某個結點的值,lr為0或1,非空二叉樹c與t不相交且右子樹為空

//操作結果:根據lr為0或1,插入c為t中p結點的左或右子樹。p結點的原有左或右子樹則成為c的右子樹

int j,k,i=0;

for(j=0;j>p.level>>p.order;

e=value(t,p);

cout

assign(t,p,e);

cout>j;

insertchild(t,e,j,s);

print(t);

cout<

cin>>p.level>>p.order>>j;

deletechild(t,p,j);

print(t);

clearbitree(t);

cout<

請按層序輸入結點的值(整型),0表示空結點,輸999結束。結點數≤100:

1 2 3 4 5 0 6 7 999(見圖63)

建立二叉樹後,樹空否?0(1:是0:否) 樹的深度=4

二叉樹的根為1

層序遍歷二叉樹:

1 2 3 4 5 6 7

中序遍歷二叉樹:

7 4 2 5 1 3 6

後序遍歷二叉樹:

7 4 5 2 6 3 1

請輸入待修改結點的層號本層序號: 2 2

待修改結點的原值為3請輸入新值: 8

先序遍歷二叉樹:

1 2 4 7 5 8 6

結點8的雙親為1,左右孩子分別為0,6,左右兄弟分別為2,0

建立右子樹為空的樹s:

請按層序輸入結點的值(整型),0表示空結點,輸999結束。結點數≤100:

10 11 0 13 14 0 0 17 999(見圖64)

樹s插到樹t中,請輸入樹t中樹s的雙親結點s為左(0)或右(1)子樹: 2 1(見圖65)

第1層: 1:1

第2層: 1:2 2:8

第3層: 1:4 2:10 4:6

第4層: 1:7 3:11 4:5

第5層: 5:13 6:14

第6層: 9:17

刪除子樹,請輸入待刪除子樹根結點的層號本層序號左(0)或右(1)子樹: 3 2 0(見圖66)

第1層: 1:1

第2層: 1:2 2:8

第3層: 1:4 2:10 4:6

第4層: 1:7 4:5

清除二叉樹後,樹空否?1(1:是0:否) 樹的深度=0

樹空,無根

二叉樹的順序儲存結構

此結構是將二叉樹的所有結點,按照一定的次序,儲存到一片連續的儲存單元中。因此,必須將結點排成乙個適當的線性序列,使得結點在這個序列中的相應位置能反映出結點之間的邏輯關係。這種結構特別適用於近似滿二叉樹。在一棵具有n個結點的近似滿二叉樹中,我們從樹根起,自上層到下層,逐層從左到右給所有結點編號,就能得...

二叉樹的順序儲存結構

二叉樹的順序儲存結構 include includeusing namespace std define virnode 0 定義虛擬節點 define max tree size 100 定義儲存空間最大量 typedef char elemtype 定義節點型別 typedef elemtype...

二叉樹的順序儲存結構

新增鏈結描述 上面文章中講述二叉樹的順序儲存結構的 這裡給執行了一下,以及遇到的一些問題,我都在 裡標註了.include includeusing namespace std const int m 100 class bitree int create bt 手動輸入二叉樹各節點的資訊 void...