7-1 孩子链存储结构下树的基本运算算法和求树t的高度

本文介绍了一种孩子链存储结构,并提供了一个通过该结构创建树的算法。此外,还详细阐述了如何利用递归算法计算树的高度。通过具体的代码实现,展示了树结构的创建、显示及销毁过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//孩子链存储结构下树的基本运算算法和求树t的高度
#include <stdio.h>
#include <malloc.h>
#define MaxSons 10
#define MaxSize 100
typedef struct node
{	char data;							//节点的值
	struct node *sons[MaxSons];			//指向孩子节点
} TSonNode;								//孩子链存储结构类型

TSonNode *CreateTree(char *str)			//由str建立孩子链存储结构
{	struct
	{	TSonNode *nodep;				//节点指针
		int num;						//孩子个数
	} St[MaxSize];						//定义顺序栈
	int top=-1;							//栈顶指针
	int i=0,j; char ch=str[i];
	TSonNode *t=NULL,*p;
	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=(TSonNode *)malloc(sizeof(TSonNode));
			p->data=ch;					//建立一个节点p存放ch
			for (j=0;j<MaxSons;j++)		//所有孩子指针置为NULL
				p->sons[j]=NULL;
			if (t==NULL)				//原为空树
				t=p;
			else						//将其作为栈顶节点的一个孩子
				St[top].nodep->sons[St[top].num]=p;
			break;
		}
		i++;
		ch=str[i];
	}
	return t;
}

void DispTree(TSonNode *t)				//输出孩子链存储结构
{	int i;
	if (t!=NULL)
	{	printf("%c",t->data);
		if (t->sons[0]!=NULL)			//t节点至少有一个孩子
		{	printf("(");				//输出一个左括号
			for (i=0;i<MaxSons;i++)
			{	DispTree(t->sons[i]);
				if (t->sons[i+1]!=NULL)	//如果有下一个孩子
					printf(",");		//输出一个','
				else					//如果没有下一个孩子
					break;				//退出循环
			}
			printf(")");				//输出一个右括号
		}
	}
}

void DestroryTree(TSonNode *&t)			//销毁树t
{	int i;
	if (t!=NULL)
	{	for (i=0;i<MaxSons;i++)
		{	if (t->sons[i]!=NULL)		//有子树
				DestroryTree(t->sons[i]);//销毁该子树
			else						//再没有子树
				break;					//退出循环
		}
		free(t);						//释放根节点
	}
}

int TreeHeight1(TSonNode *t)			//求树t高度
{	TSonNode *p;
	int i,h,maxh=0;
	if (t==NULL) return 0;				//空树返回高度0
	else								//处理非空树
	{	for (i=0;i<MaxSons;i++)
		{	p=t->sons[i];				//p指向t的第i-1个孩子节点
			if (p!=NULL)				//若存在第i-1个孩子
			{	h=TreeHeight1(p);		//求出对应子树的高度
				if (maxh<h) maxh=h;		//求所有子树的最大高度
			}
		}
		return(maxh+1);					//返回maxh+1
	}
}

int main()
{
	TSonNode *t;
	t=CreateTree("A(B,C(E,F,G),D)");
	printf("t:"); DispTree(t);
	printf("\n树t的高度:%d\n",TreeHeight1(t));
	DestroryTree(t);
	return 1;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值