要求:給出一組數據,根據這組數據創建完全二叉樹。
首先,我們知道,數組下標的范圍是0到n-1,而在樹中編號是從1開始的,下標的范圍是1到n;
根據二叉樹的性質(將一個完全二叉樹按照從上到下,從左到右進行編號,其編號為i的節點,如果滿足2*i<=n,則說明編號為i的節點有左孩子,否則沒有,如果滿足2*i+1<=n,則說明編號為i的節點有右孩子,否則沒有)可知
2*i<=n
2*i+1<=n
該性質是對樹的編號(1~n)成立的,而數組的下標是從0到n-1,將對應下標都減1可知,對於數組0~n-1來說,
2*i-1<=n-1
2*i<=n-1是成立的。
進一步來看一下得到的兩個新規律是否能直接用,對於2*i-1<=n-1 來說,當i=0時 ,2*i-1=-1,而2*i-1對應的是什么呢?是編號i的節點的左孩子的編號,顯然沒有編號為-1的節點,那我們試一試將2*i-1+1呢,當i=0時 ,2*i-1=0,編號為0的節點對應的左孩子顯然不能是本身,於是在此基礎上再加一,得到結論:
2*i-1+2=2*i+1<=n-1
2*i+2=2*i+2<=n-1
接下來就是具體實現的思路了:
malloc出一塊連續的空間,每一塊空間放的都是一個BinaryTree結構體
1 //根據數組創建完全二叉樹 2 #include<iostream> 3 #include<stdio.h> 4 using namespace std; 5 typedef struct Tree 6 { 7 int value; 8 struct Tree*left; 9 struct Tree*right; 10 11 }BinaryTree; 12 BinaryTree* create(int a[],int n) 13 { 14 BinaryTree *ptree=(BinaryTree*)malloc(sizeof(BinaryTree )*n); 15 int i; 16 for(i=0;i<n;i++) 17 { 18 ptree[i].value=a[i];//數組a只起到一個賦值的作用 19 ptree[i].left=NULL; 20 ptree[i].right=NULL; 21 } 22 for(i=0;i<=n/2-1;i++)//原來的父親節點范圍為1~n/2,現在0~n/2-1,所以注意n/2要取到等 23 { 24 if(2*i+1<=n-1) 25 ptree[i].left=&ptree[2*i+1];//把第2*i+1個結點的地址賦給左孩子 26 if(2*i+2<=n-1) 27 ptree[i].right=&ptree[2*i+2]; 28 } 29 return ptree; 30 } 31 void preorder(BinaryTree* t) 32 { 33 if(t==NULL) return ; 34 printf("%d\n",t->value); 35 preorder(t->left); 36 preorder(t->right); 37 } 38 int main() 39 { 40 int a[]={3,4,5,8,9,10}; 41 BinaryTree *root=NULL; 42 root=create(a,sizeof(a)/sizeof(a[0])); 43 44 preorder(root); 45 return 0; 46 }
-