二叉樹的性質:node
性質 1 在二叉樹的第i層上至多有2^(i-1)個結點(i>=1)。數據結構
性質 2 深度爲k的二叉樹至多有2^k-1個結點,(k>=1)。函數
性質 3 任何一顆二叉樹,終端結點爲n0,度爲2的結點爲n2,那麼n0=n2+1。post
性質 4 具備n個結點的徹底二叉樹的深度爲└㏒2 n┘+1。學習
性質 5 徹底二叉樹按層次從上到下從左到右依次編號。編號爲n的節點的左孩子爲2n。測試
二叉樹的儲存結構:.net
lchild | data | rchild |
/*---------二叉樹的二叉鏈表儲存表示----------*/ typedef struct BiTNode{ ElemType data; struct BiTNode *lchild,*rchild; }BiTNode ,*BiTree;
非遞歸遍歷須要棧:棧的實現過程:棧的線性儲存結構與鏈式儲存結構的實現(C語言)。指針
棧部分的內容:code
typedef BiTree pElemType; typedef struct Snode //棧的儲存結構 { pElemType data; //數據域 struct Snode *next; //指針域 }Snode,*LinkStack; void Init_StackL(LinkStack *S) //初始化院棧 { *S=NULL; } Status Push_L(LinkStack *S,pElemType x) //壓棧 { LinkStack p; p=(LinkStack)malloc(sizeof(Snode)); p->data=x; p->next=*S; *S=p; return 1; } Status Pop_L(LinkStack *S,pElemType *temp_) //出棧 { LinkStack p; pElemType temp; if(*S==NULL) return 0; temp=(*S)->data; p=*S; *S=p->next; free(p); *temp_=temp; return 1; } Status StackEmpty(LinkStack *S) //判斷棧頂是否爲空 若是爲空返回 0 { if(*S==NULL) return 0; else return 1; }
如下爲二叉樹部分:blog
Status CreateBiTree(BiTNode **T) //先序生成二叉樹 { int ch; scanf("%d",&ch); if(ch==0) *T=NULL; else{ if(!(*T=(BiTNode *)malloc(sizeof(BiTNode))))exit(0); (*T)->data=ch; CreateBiTree(&(*T)->lchild); CreateBiTree(&(*T)->rchild); } return 1; } } Status preOrderTraverse(BiTNode *T)//前序遍歷二叉樹,並統計總結點 { int i=0; LinkStack S; BiTNode *p; p=T; Init_StackL(&S); while(p||StackEmpty(&S)){//StackEmpty(&S)判斷棧頂是否爲空 若是爲空返回 0 if(p){ Push_L(&S,p); printf("%d\t",p->data); i++; p=p->lchild; } else{ Pop_L(&S,&p); if(!(p->data)) return 0; p=p->rchild; } } // return 1; printf("\n全部生成節點的總數爲:%d\n",i);//總結點 } Status InOrderTraverse(BiTNode *T) //中序遍歷二叉樹 { LinkStack S; BiTNode *p; p=T; Init_StackL(&S); while(p||StackEmpty(&S)){//StackEmpty(&S)判斷棧頂是否爲空 若是爲空返回 0 if(p){ Push_L(&S,p); p=p->lchild; } else{ Pop_L(&S,&p); if(!(p->data)) return 0; printf("%d\t",p->data); p=p->rchild; } } return 1; } void postorder(BiTNode *T)//用遞歸的方法後續遍歷二叉樹 { if(T!=NULL) { postorder(T->lchild); postorder(T->rchild); printf("%d\t",T->data); } }
如下爲測試函數,先序生成二叉樹:若是爲結點空則輸入 0。
咱們輸入的數據爲:1 2 4 0 0 5 0 0 3 0 0 ;
void main() { BiTNode *T; printf("請按以下圖案先序生成鏈表,0表明爲空:\n"); printf(" ①\n"); printf(" ╱ ╲\n"); printf(" ② ③ \n"); printf(" ╱ ╲\n"); printf("④ ⑤ \n"); printf("輸入的數字是1 2 4 0 0 5 0 0 3 0 0 "); CreateBiTree(&T); printf(" ①\n"); printf(" ╱ ╲\n"); printf(" ② ③ \n"); printf(" ╱ ╲\n"); printf("④ ⑤ \n"); printf("中序遍歷二叉樹的結果爲:"); InOrderTraverse(T); printf("\n後續遍歷二叉樹的結果爲:"); postorder(T);//用遞歸的方法後續遍歷二叉樹 printf("\n前序遍歷二叉樹的結果爲: "); preOrderTraverse(T); printf("\n"); }
程序運行的結果爲:
學習數據結構記錄,若有錯誤歡迎指正。
參考書:數據結構 c語言版