二叉樹主要有兩種實現方式,數組形式和鏈表形式,其中數組形式是利用完全二叉樹的性質5:
性質5:如果對一棵有n個結點的完全二叉樹的結點按層序編號,則對任一結點i(1in),有: (1) 如果i=1,則結點i是二叉樹的根,無雙親;如果i>1,則其雙親是i/2 (2) 如果2i>n,則結點i無左孩子;如果2in,則其左孩子是2i (3) 如果2i+1>n,則結點i無右孩子;如果2i+1n,則其右孩子是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.所以不能用它來控制循環的。。。坑