使用三个指针域,分别是父节点指针,左孩子节点指针,右孩子节点指针,便于找到节点的父亲。
#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;
}