使用三个指针域,分别是父节点指针,左孩子节点指针,右孩子节点指针,便于找到节点的父亲。

二叉树的链式存储代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define COUNT 100
#pragma warning(disable:4996)

/*
二叉树的链式结构存储实现
*/

//二叉树结构体
typedef struct _BiTree
{
	char nData;//存放数据
	struct _BiTree* pParent;//父节点
	struct _BiTree* pLeft;//左孩子节点
	struct _BiTree* pRight;//有孩子节点
}BiTree,*PBiTree;

//保存二叉树指针的栈结构
typedef struct _AddrStack
{
	PBiTree pStack[COUNT];//栈
	int nTop;//栈顶指针
}AddrStack,*PAddrStack;

/*为二叉树申请内存空间
*/
PBiTree BiTreeMalloc()
{
	//申请内存
	PBiTree pThis = (PBiTree)malloc(sizeof(BiTree));
	if (pThis == NULL)
	{
		puts("内存申请失败");
		system("pause");
		exit(0);
	}
	memset(pThis, 0, sizeof(BiTree));
	return pThis;
}

/*接收二叉树节点数据
@pStack:栈指针
*/
bool InputBiTreeData(PAddrStack pBiTreeStack)
{
	//当前节点
	PBiTree pThis = NULL;
	//左孩子节点和有孩子节点
	PBiTree pLeftNode = NULL;
	PBiTree pRightNode = NULL;
	//栈空情况
	if (pBiTreeStack->nTop == -1)
	{
		return false;
	}

	//出栈
	pThis = pBiTreeStack->pStack[pBiTreeStack->nTop--];
	//清空一下,调试的时候出栈我就不想再看到这个数据了
	pBiTreeStack->pStack[pBiTreeStack->nTop + 1] = NULL;

	pLeftNode = BiTreeMalloc();
	printf("请输入 [%c] 的左孩子节点\n",pThis->nData);
	pLeftNode->nData = getchar();
	getchar();
	if (pLeftNode->nData == '#')
	{
		return true;
	}
	pThis->pLeft = pLeftNode;//左孩子节点
	pLeftNode->pParent = pThis;//父节点
	pBiTreeStack->pStack[++pBiTreeStack->nTop] = pLeftNode;//左节点入栈

	pRightNode = BiTreeMalloc();
	printf("请输入 [%c] 的右孩子节点\n",pThis->nData);
	pRightNode->nData = getchar();
	getchar();
	if (pRightNode->nData == '#')
	{
		return true;
	}
	pThis->pRight = pRightNode;//右孩子节点
	pRightNode->pParent = pThis;//右孩子节点
	pBiTreeStack->pStack[++pBiTreeStack->nTop] = pRightNode;//右节点入栈
	return true;
}

/*创建二叉树
@PBiTree:二叉树根节点
*/
PBiTree CreateBiTree()
{
	PBiTree pTihs = NULL;
	//栈
	AddrStack stBiTreeStack = { 0 };

	//栈顶指针初始化为-1
	stBiTreeStack.nTop = -1;

	//根节点数据
	pTihs = BiTreeMalloc();
	puts("请输入二叉树的根节点数据");
	pTihs->nData = getchar();
	getchar();
	//把根节点保存到栈中
	stBiTreeStack.pStack[++stBiTreeStack.nTop] = pTihs;
	do 
	{
		//system("cls");
		puts("[#] 代表空节点");
		if (!InputBiTreeData(&stBiTreeStack))
		{
			break;
		}
	} while (1);
	puts("二叉树创建成功");
	return pTihs;
}

//前序遍历递归输出二叉树
//@pThis:二叉树指针
void ShowBiTree(PBiTree pThis)
{
	//为空就返回
	if (pThis == NULL)
	{
		return;
	}

	printf("[%c] ",pThis->nData);//输出根节点
	ShowBiTree(pThis->pLeft);//输出左孩子节点
	ShowBiTree(pThis->pRight);//输出右孩子节点
}

int main(int argc, char *argv[])
{
	PBiTree pThis = NULL;
	pThis = CreateBiTree();
	ShowBiTree(pThis);
	system("pause");
	return 0;
}

 

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-11-01
  • 2022-12-23
  • 2021-09-02
  • 2022-01-22
猜你喜欢
  • 2021-07-06
  • 2021-04-22
  • 2021-10-15
  • 2021-04-05
相关资源
相似解决方案