二叉樹----根據數組創建完全二叉樹


要求:給出一組數據,根據這組數據創建完全二叉樹。

  首先,我們知道,數組下標的范圍是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 }

 

-


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM