完全二叉樹或滿二叉樹的數組實現(參考性質5)


  二叉樹主要有兩種實現方式,數組形式和鏈表形式,其中數組形式是利用完全二叉樹的性質5:

性質5:如果對一棵有n個結點的完全二叉樹的結點按層序編號,則對任一結點i(1in),有:
  (1)  如果i=1,則結點i是二叉樹的根,無雙親;如果i>1,則其雙親是i/2
  (2)  如果2i>n,則結點i無左孩子;如果2in,則其左孩子是2i
  (3)  如果2i+1>n,則結點i無右孩子;如果2i+1n,則其右孩子是2i+1

來實現的,左邊的節點的下標是根節點的下標的2倍,右邊的節點的下標是根節點下標的2倍加1。千萬要記住這個只能用於完全二叉樹(滿二叉樹其實就是更加完美的完全二叉樹),上篇文章寫的那種多杈樹是用不了的,一般的二叉樹也只是有的能用。。(估計很少,就當做不能用吧)。

對應樹的操作我用數組實現了樹的插入,刪除,遍歷。因為二叉樹是一個完全二叉樹,插入以后也要維持完全二叉樹的性質,所以看來只能在數組的最后一位插入了。刪除的我寫了一個從中間節點刪的函數,但是感覺實用價值不是很大。

這里是實現代碼:

#include<stdio.h>
char src[10]={0,'a','b','c','d','e','f'};//6個元素

int length(char a[]){
    int ret = 1;
    while(a[ret]!=0){ret++;}
    return ret;
}
void insert(char data){

    int srclen = length(src);
    src[srclen] = data;
    
}
void del(int index){
    //把數組index后面的內容都往前面挪一位
    int cur_l = length(src) - 1;
    src[index] = 0;
    for(int i=index;i<cur_l;i++){
        src[i] = src[i+1];
    }
    src[cur_l] = 0;
}
void preorder(int n){
        
    if(n>length(src)){return;}

    printf("%c",src[n]);
    preorder(2*n);
    preorder(2*n+1);

}
void print(){
    int srclength = sizeof(src)/sizeof(char);
    for(int i=0;i<srclength;i++){
        printf("%c",src[i]);
    }
    printf("\n");
}
int main(){
    
    print();
    
    insert('h');
    print();

    del(2);
    print();

    preorder(1);//從1開始

    return 0;
}
sizeof(src)/sizeof(char)這個東西它始終等於的是數組開辟的個數,這里也就是一直等於10.所以不能用它來控制循環的。。。坑


免責聲明!

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



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