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

文章目录

    • 二叉树顺序存储结构

二叉树顺序存储结构

  • 顺序存储结构类型说明
/*顺序存储结构类型定义*/
#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;
}

你可能感兴趣的:(数据结构(C语言),二叉树,算法,数据结构,链表)