7-2 孩子兄弟鏈儲存結構下樹的基本運算演算法和求樹t的高度
阿新 • • 發佈:2019-02-13
//孩子兄弟鏈儲存結構下樹的基本運算演算法和求樹t的高度 #include <stdio.h> #include <malloc.h> #define MaxSize 100 typedef struct tnode { char data; //節點的值 struct tnode *hp; //指向兄弟 struct tnode *vp; //指向孩子節點 } TSBNode; //孩子兄弟鏈儲存結構型別 TSBNode *CreateTree(char *str) //由str建立孩子兄弟鏈儲存結構 { struct { TSBNode *nodep; //節點指標 int num; //孩子個數 } St[MaxSize]; //順序棧 int top=-1; //棧頂指標 int i=0,j; char ch=str[i]; TSBNode *t=NULL,*p,*q; while (ch!='\0') { switch(ch) { case '(': top++; St[top].nodep=p; St[top].num=0; //當前節點p進棧 break; case ')':top--; break; //退棧 case ',':St[top].num++; break; //棧頂節點增加一個孩子 default: p=(TSBNode *)malloc(sizeof(TSBNode)); p->data=ch; //建立一個節點p存放ch p->hp=p->vp=NULL; if (t==NULL) //原為空樹 t=p; else //將其作為棧頂節點的一個孩子 { if (St[top].num==0) //第一個孩子用vp指向它 St[top].nodep->vp=p; else //其他孩子用棧頂節點的孩子節點的hp指向它 { q=St[top].nodep->vp; for (j=1;j<St[top].num;j++) q=q->hp; q->hp=p; } } break; } i++; ch=str[i]; } return t; } void DispTree(TSBNode *t) //輸出孩子兄弟鏈儲存結構 { TSBNode *p; if (t!=NULL) { printf("%c",t->data); if (t->vp!=NULL) //有孩子時輸出一個'(' { printf("("); p=t->vp; //p指向節點t的第一個孩子 while (p!=NULL) { DispTree(p); p=p->hp; if (p!=NULL) printf(","); } printf(")"); //輸出一個')' } } } void DestroryTree(TSBNode *&t) //銷燬樹t { if (t!=NULL) { DestroryTree(t->vp); DestroryTree(t->hp); free(t); //釋放根節點 } } int TreeHeight2(TSBNode *t) { TSBNode *p; int h,maxh=0; if (t==NULL) return 0; //空樹返回0 else { p=t->vp; //指向第1個孩子節點 while (p!=NULL) //掃描t的所有子樹 { h=TreeHeight2(p); //求出p子樹的高度 if (maxh<h) maxh=h; //求所有子樹的最大高度 p=p->hp; //繼續處理t的其他子樹 } return(maxh+1); //返回maxh+1 } } int main() { TSBNode *t; t=CreateTree("A(B,C(E,F,G),D)"); printf("t:"); DispTree(t); printf("\n樹t的高度:%d\n",TreeHeight2(t)); DestroryTree(t); return 1; }