1. 程式人生 > >7-2 孩子兄弟鏈儲存結構下樹的基本運算演算法和求樹t的高度

7-2 孩子兄弟鏈儲存結構下樹的基本運算演算法和求樹t的高度

//孩子兄弟鏈儲存結構下樹的基本運算演算法和求樹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;
}