二叉树的链式存储与实现(C++)

二叉链表存储结构的类型定义如下:

typedef struct Node
{
	DataType data;
	struct Node *lchild;
	struct Node *rchild;
}*BiTree,BitNode;

二叉树的基本运算:

(1)二叉树的初始化操作。

二叉树的初始化需要将指向二叉树的根结点指针置为空。

void InitBitTree(BiTree *T)
{
	*T=NULL;
}

(2)二叉树的销毁操作。

void DestroyBitTree(BiTree *T)
{
	if (*T)
	{
		if ((*T)->lchild)
		{
			DestroyBitTree(&((*T)->lchild));
		}
		if ((*T)->rchild)
		{
			DestroyBitTree(&((*T)->rchild));
		}
		free(*T);
		*T=NULL;
	}
}
(3)创建二叉树操作。

根据二叉树的递归定义,先生成二叉树的根结点,将元素值赋值给结点的数据域,然后递归创建左子树和右子树。


void CreateBitTree(BiTree *T)
{
	DataType ch;
	scanf("%c",&ch);
	if (ch=='#')
	{
		*T=NULL;
	} 
	else
	{
		*T=(BiTree)malloc(sizeof(BitNode));	//生成根结点
		if (!(*T))
		{
			exit(-1);
		}
		(*T)->data=ch;
		CreateBitTree(&((*T)->lchild));	//构造左子树
		CreateBitTree(&((*T)->rchild));	//构造右子树
	}
}
(4)二叉树的左插入操作。

指针p指向二叉树T的某个结点,将子树c插入到T中,使c成为p指向结点的左子树,p指向结点的原来左子树成为右子树。

int InsertLeftChild(BiTree p,BiTree c)
{
	if (p)
	{
		c->rchild=p->lchild;
		p->lchild=c;
		return 1;
	}
	return 0;
}

(5)二叉树的右插入操作。

指针p指向二叉树T的某个结点,将子树c插入到T中,使c成为p指向结点的右子树,p指向结点的原来右子树成为右子树。

int InsertRightChild(BiTree p,BiTree c)
{
	if (p)
	{
		c->rchild=p->rchild;
		p->rchild=c;
		return 1;
	}
	return 0;
}

(6)返回二叉树结点的指针操作。

在二叉树中查找指向元素值为e的结点,如果找到该结点,则返回该结点的指针,否则,返回NULL。

BiTree Point(BiTree T,DataType e)
{
	BiTree Q[MaxSize];	//定义一个队列,用于存放二叉树中结点的指针
	int front=0,rear=0;	//初始化队列
	BitNode *p;
	if (T)
	{
		Q[rear]=T;
		rear++;
		while(front==rear)	//如果队列非空
		{
			p=Q[front++];	//取出队头指针,并出队
			if (p->data==e)
			{
				return p;
			}
			if (p->lchild)	//如果左孩子结点存在,将左孩子结点入队
			{
				Q[rear++]=p->lchild;
			}
			if (p->rchild)	//如果右孩子结点存在,将右孩子结点入队
			{
				Q[rear++]=p->rchild;
			}
		}
	}
	return NULL;
}

(7)返回二叉树结点的左孩子元素值操作。

如果元素值为e的结点存在,并且该结点的左孩子结点存在,则将该结点的左孩子结点的元素值返回。

DataType LeftChild(BiTree T,DataType e)
{
	BiTree p;
	if (T)
	{
		p=Point(T,e);
		if (p&&p->lchild)
		{
			return p->lchild->data;
		}
	}
	return;
}

(8)返回二叉树结点的右孩子元素值操作。
如果元素值为e的结点存在,并且该结点的右孩子结点存在,则将该结点的右孩子结点的元素值返回。

DataType RightChild(BiTree T,DataType e)
{
	BiTree p;
	if (T)
	{
		p=Point(T,e);
		if (p&&p->rchild)
		{
			return p->rchild->data;
		}
	}
	return;
}

(9)二叉树的左删除操作。

在二叉树中,指针p指向二叉树的某个结点,将p所指向的结点的左子树删除。

int DeleteLeftChild(BiTree p)
{
	if (p)
	{
		DestroyBitTree(&(p->lchild));
		return 1;
	}
	return 0;
}

(10)二叉树的右删除操作。

在二叉树中,指针p指向二叉树的某个结点,将p所指向的结点的右子树删除。

int DeleteRightChild(BiTree p)
{
	if (p)
	{
		DestroyBitTree(&(p->rchild));
		return 1;
	}
	return 0;
}


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
叉树是一种常用的数据结构,它可以通过链存储的方来表示。在设计学生健康系统时,可以使用二叉树存储学生的健康信息。 首先,我们可以设计一个Student类,其中包含学生的姓名、学号等基本信息。同时,我们为每个学生创建一个二叉树节点,节点中存储学生的健康信息。 在学生健康系统中,每个学生节点的左子节点和右子节点分别表示该学生的前一天和后一天的健康情况。左子节点存储前一天的健康信息,右子节点存储后一天的健康信息。 假设每个学生的健康信息用一个健康状态码来表示,如0代表健康,1代表发烧,2代表感冒等。通过将健康状态码存储在节点中,可以方便地记录学生每天的健康状态。 为了方便对学生健康信息的管理和查询,可以在二叉树的基础上添加一些功能,比如添加学生节点、删除学生节点、更新学生健康信息等等。这些功能可以通过递归的方实现,对于每个节点进行操作。 例如,添加学生节点时,可以先判断根节点是否存在,如果不存在则将待添加节点作为根节点。如果待添加节点小于当前节点,则将其作为当前节点的左子节点,如果大于当前节点,则将其作为当前节点的右子节点。对于每个节点,都可以通过递归调用相应的插入函数来找到合适的位置。 总结来说,通过使用二叉树的链存储,我们可以设计一个学生健康系统,它可以方便地存储和管理学生的健康信息,包括每天的健康状态。通过递归等操作,可以实现对学生节点的添加、删除和更新等功能,方便对学生健康信息进行查询和统计。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值