完全二叉树的顺序存储代码实现

1.必须把二叉树补全成为完全二叉树,对应位置没有节点的补虚节点,虚节点只占位,不存放节点数据。

2.完成二叉树第i个节点的左孩子节点就是2i,有孩子节点就是2i+1。

完全二叉树的顺序存储代码实现_第1张图片

#include 
#include 
#define COUNT 200
#pragma warning(disable:4996)

/*
二叉树的顺序存储
要把一般二叉树改为完全二叉树才行,虚节点占位不放数据
*/

//完全二叉树结构体
typedef struct _FullBiTree
{
	char nTreeArray[COUNT];//存放二叉树结点信息
}FullBiTree,*PFullBiTree;

//求指定X的指定Y次方
int Pow(int x, int y)
{
	int nIndex = 0;
	int nRet = 1;
	
	//任何数的0次方都是1
	if (y == 0)
		return 1;

	for (; nIndex < y; nIndex++)
	{
		nRet *= x;
	}
	return nRet;
}

//输入节点的数据
//@pTree:二叉树指针
//@nLevle:第几层
bool InputNodeData(PFullBiTree pTree,int nLevle)
{
	//当前层的根节点数量
	int nNodeCount = 0;
	//索引
	int nIndex = 0;
	//空节点数量
	int nCount = 0;
	//左右节点
	char nLeftNode = 0;
	char nRightNode = 0;

	//根据层数获得当前层有多少个节点
	nNodeCount = Pow(2, nLevle);

	//当前输入的是根节点的时候
	if (nNodeCount == 1)
	{
		printf("输入根节点数据\n");
		pTree->nTreeArray[1] = getchar();
		getchar();
	}
	else
	{
		for (nIndex = nNodeCount; nIndex < nNodeCount * 2; nIndex+=2)
		{
			//虚节点的情况下我们不需要输入下一个节点数据
			if (pTree->nTreeArray[nIndex / 2] == '#')
			{
				//如果一层都是虚节点的话,代表二叉树完了
				nCount += 2;
				if (nCount == nNodeCount)
				{
					return false;
				}
				continue;
			}

			//接收左右节点数据
			printf("请输入 %c 的左孩子节点\n", pTree->nTreeArray[nIndex / 2]);
			nLeftNode = getchar();
			getchar();
			printf("请输入 %c 的右孩子节点\n", pTree->nTreeArray[nIndex / 2]);
			nRightNode = getchar();
			getchar();

			//判断是不是要结束二叉树的输入
			if (nLeftNode == '*')
			{
				pTree->nTreeArray[nIndex] = '#';
				pTree->nTreeArray[nIndex + 1] = '#';
				return false;
			}
			else if (nRightNode == '*')
			{
				pTree->nTreeArray[nIndex] = nLeftNode;
				pTree->nTreeArray[nIndex + 1] = '#';
				return false;
			}

			//保存左右节点数据
			pTree->nTreeArray[nIndex] = nLeftNode;
			pTree->nTreeArray[nIndex + 1] = nRightNode;
		}
	}
	return true;
}

//创建二叉树
//@pTree:二叉树指针
void CreateFullBiTree(PFullBiTree pTree)
{
	int nLevle = 0;
	do 
	{
		system("cls");
		puts("输入 * 结束二叉树输入,输入 # 代表虚节点");
		printf("输入第 %d 层节点数据\n", nLevle + 1);
		if (!InputNodeData(pTree, nLevle++))
		{
			break;
		}
	} while (1);
	printf("二叉树输入成功\n");
}

//显示二叉树
void ShowBinaryTree(PFullBiTree pTree)
{
	int nIndex = 0;

	if (pTree == NULL)
	{
		printf("二叉树指针为空");
		return;
	}

	//索引0处不放数据为0,所以直接输出这里
	printf("[%d] ",pTree->nTreeArray[nIndex++]);

	while (1)
	{
		//为空的情况下退出
		if (pTree->nTreeArray[nIndex] == '\0')
		{
			break;
		}
		printf("[%c] ", pTree->nTreeArray[nIndex++]);
	}
	printf("\n完成输出");
}

int main(int argc, char *argv[])
{
	FullBiTree stTree = { 0 };
	CreateFullBiTree(&stTree);
	ShowBinaryTree(&stTree);
	system("pause");
	return 0;
}

 

你可能感兴趣的:(数据结构)