BinaryTree表示法---阵列
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <stdlib.h> struct tree /*樹的結構宣告*/ { int data; /*節點資料*/ int left; /*指向左子樹的位置*/ int right; /*指向右子樹的位置 */ }; typedef struct tree treenode; /*樹的結構新型 態*/ treenode btree[15]; /*宣告樹的結構陣列*/ void createbtree(int *data,int len) { int level; /*樹的階層*/ int pos; /* -1是右樹,1是左樹 */ int i; btree[0].data = data[0]; /* 建立樹根節點*/
將下列資料依序輸入一個二元樹,則建立的二 元樹如下圖: 15,6,4,8,23,77,1,19
(2) (4) 4 6 (5) 8 (6) 19 15 (1) (3) 23 (7) 77
(8) 1
Binary Tree陣列表示法---程式碼
#include<stdio.h> #include<stdlib.h> void createbtree(int *btree,int *data,int len) { int level; /*樹的階層*/ int i; btree[1] = data[0]; /*建立根節點*/ for ( i = 2; i <= len; i++ ) /*用迴路建立其 它節點*/ { level = 1; /*從階層1開始*/ while ( btree[level] != 0 ) /*是否有子樹*/ { if ( data[i-1] > btree[level] ) /*是左或右 子 樹*/ level = level * 2 + 1; /*右子樹*/ else level = level * 2; /*左子樹*/ } btree[level] = data[i-1]; /*存入節點資料*/ } }
1.將第一個元素插入為 [4] [5] [6] 根節點。 3 2.將插入的元素與節點值比較,若大於大於節點值, 將此元素送往節點的右子樹,若右子樹不是空的, 則需要重複比較,否則建立節點且將元素值插入。 3.若小於節點值,將此元素送往節點的左子樹,類似 上述法。
2
Binary Tree陣列表示法---範例
左、右子樹亦是二元樹。
又稱為有序樹,每一個節點之degree<=2,左右有次 序之分結構(hw1)
Binary Tree表示法---陣列
左子樹是父節點乘以2 右子樹是父節點乘以2+1 演算法步驟:
儲存位置 [1] [2] [3]
level 1
int main() { int btree[16]; /* 二元樹陣列*/ /* 二元樹節點資料 */ int data[8]={15,6,4,8,23,77,1,19}; int i; for( i = 1; i < 16; i++ ) /*清除二元樹 陣列*/ btree[i]=0; createbtree(btree,data,8); /*建立二 元樹*/ for( i =1; i <16;i++) /*列出二元樹內容*/ printf("%2d: [%d] \n",i,btree[i]); system("pause"); return 0; }
for(i=1;i<len;i++) /*用迴路建立其它節點*/ { btree[i].data = data[i]; /* 建立節點內容*/ level=0; /*從樹根開始*/ pos=0; /*設定pos值*/ while(pos==0) /*用迴路找節點位置*/ { /*比較是左或右子樹*/ if(data[i]>btree[level].data ) { /*右樹是否有下一階層*/ if(btree[level].right!=-1) level = btree[level].right; else pos = -1; /*是右子樹*/ } else { /*左樹是否有下一階層*/ if ( btree[level].left != -1 ) level = btree[level].left; else pos = 1; /*是左子樹*/ } } if ( pos == 1 ) /*建立節點左右位置*/ btree[level].left = i; /*鏈結左子樹*/ else btree[level].right = i; /*鏈結右子樹*/ } }
Tree
術語:
Level(階層):樹根的階層為1,若某節點的階層為i, 則子節點的階層就為i+1 Height(高度或深度):一棵樹所具有的最大階層.
level A B C D 1
2 3
E
F
G
Binary Tree
節點個數是有限的,且可以沒有節點。 二元樹可以分為兩個子樹稱為左子樹與右子樹。
Trees
授課者:驕芸
Outline
Tree Binary Tree Delete Nodes from Binary Tree Thread Binary Tree
Tree
定義:由一個或多個節點構成的有限集合。 特性:
有一特定節點稱為樹根(Root) 其餘的節點之集合稱為子樹(Subtree)
Binary Tree表示法---結構陣列
每個節點至多擁有兩個子節點與一個資料欄位. 結構宣告如下圖所示: left data right
struct tree { int data; int left; int right; }; typedef struct tree treenode; treenode btree[15];
結構陣列表示法
(1)
6 15
(0)
(2) 23
index 0 1 2
(3) 77
left 1 -1 -1
data 15 6 23
right 2 -1 3
•Index為0表示樹根 •Left欄位是-1,表示沒有左子樹 •Right欄位是-1,表示沒有右子樹
3
-1
77
-1
Binary Tree結構陣列表示法---程 式碼1/2
常用術語:
Root:沒有父節點的節點 Leaf:沒有子節點的節點 Sibling:同一個父節點的所有子節點 Ancestors:從該節點至root所經過的所有節點 Degree(分支度):該節點所擁有的子節點數 Non-terminal Node:非樹葉的節點, 即degree>=1的節點