树和二叉树(二):二叉树的顺序存储

二叉树顺序存储结构

  • 顺序存储结构类型说明
/*顺序存储结构类型定义*/
#define VirNode '0'									/*定义虚节点值*/
#define MAX_TREE_SIZE 100							/*定义存储空间最大值*/
typedef char ElemType;								/*定义节点值类型*/
typedef ElemType SqBitTree[MAX_TREE_SIZE];			/*SqBitTree[0]存放结点总数,即构成满二叉树时节点个数*/

  • 二叉树层次遍历算法
/*层次遍历算法*/
void leveltree(SqBitTree bt)						/*按满二叉树遍历输出*/
{
	int i, j;
	i = 1;
	while (i <= bt[0])								/*按层扫描*/
	{
		for (j = i; j < 2 * i; j++) {
			if (bt[j] == VirNode)					/*虚节点输出*号/
				printf("*");
			else
				printf("%c", bt[j]);
		}
		printf("\n");
		i = 2 * i;									/*跳到下一层第一个结点*/
	}
}
  • 二叉树按层次建立算法
/*层次建立算法*/
void crebittree(SqBitTree bt, int n)				/*n是真实结点个数*/
{
	int i = 1, j, m = 0;
	while (m < n)
	{
		for (j = i; j < 2 * i; j++)					/*按层次输入,虚节点值也输入*/
		{
			scanf("%c", bt + j);
			if (bt[j] != VirNode)
				m++;
		}
		i = 2 * i;
	}
	bt[0] = i - 1;									/*0号单元存放结点总数*/
}
  • 交换二叉树节点的左右子树算法
/*交换二叉树所有节点的左右子树算法*/
void exchangetree(SqBitTree bt)
{
	int k = 2, i, j;
	ElemType t;
	while (k < bt[0])
	{
		for (i = k, j = 2 * k - 1; i < j; i++, j--)	/*同一层结点逆置*/
		{
			t = bt[i];
			bt[i] = bt[j];
			bt[j] = t;
		}
		k = 2 * k;									/*交换下一层结点*/
	}
}
  • 统计叶子结点个数算法
/*统计叶子结点个数算法*/
int countleaf(SqBitTree bt)
{
	int i=1, j, n=0;
	while (i < bt[0] / 2)				/*大于bt[0]/2的节点均为叶子结点*/
	{
		for (j = i; j < 2 * i; j++)
		{
			if (bt[j] != VirNode && bt[2 * j] == VirNode && bt[2 * j + 1] == VirNode)
				n++;
			i = 2 * i;					/*下一层结点的第一个结点*/
		}
		for (j = i; j < 2 * i; j++)
		{
			if (bt[j] != VirNode)
				n++;
			return n;
		}
	}
}
  • 二叉树高度算法
/*求二叉树高度算法*/
int high(SqBitTree bt)
{
	int i=1, h=0;
	while (i < bt[0])
	{
		h++;
		i = 2 * i;
	}
	return h;
}
  • 度为2的结点个数
/*统计度为2结点个数*/
int count2(SqBitTree bt)
{
	int i = 1, j, n = 0;
	while (i < bt[0] / 2)
	{
		for (j = i; j < 2 * i; j++)
		{
			if (bt[j] != VirNode && bt[2 * j] != VirNode && bt[2 * j + 1] != VirNode)
				n++;
			i = 2 * i;
		}
		return n;
	}
}
  • 度为1的节点个数
/*统计度为1结点*/
int count1(SqBitTree bt)
{
	int i = 1, j, n = 0;
	while (i <= bt[0] / 2)
	{
		for (j = i; j < 2 * i; j++) {
			if (bt[j] != VirNode && (bt[2 * j] != VirNode && bt[2 * j + 1] == VirNode || bt[2 * j] == VirNode && bt[2 * j + 1] != VirNode))
				n++;
			i = 2 * i;
		}
		i = 2 * i;
	}
}

  • 查找结点
/*找出值为x的结点的双亲结点和左右孩子结点值算法*/
int search(SqBitTree bt, ElemType x, ElemType* pa, ElemType* lc, ElemType* rc)
{
	int i = 1;
	while (i < bt[0] && bt[i] != x)							/*查找*/
		i++;
	if (i > bt[0])											/*不存在*/
	{
		printf("Not found!\n");
		*pa = *lc = *rc = VirNode;
		return 0;
	} 
	if (i == 1) {											/*根节点无双亲*/
		printf("This node has not parents!\n");
		*pa = VirNode;
	}
	else
		*pa = bt[i / 2];
	if (i > bt[0] / 2 || bt[2 * i] == VirNode)				/*无左孩子*/
	{
		printf("This node has not left child!\n");
		*lc = VirNode;
	}
	else
		*lc = bt[2 * i];
	if (i > bt[0] / 2 || bt[2 * i + 1] == VirNode)			/*无右孩子*/
	{
		printf("This Node has not right child!\n");
		*rc = VirNode;
	}
	else
		*rc = bt[2 * i + 1];
	return 1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Siri_only

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值