数据结构_P18

# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
/**
*	链式二叉树:确定一个链表只需要一个参数:根节点指针就可以了
*	链式二叉树的动态造法(用递归就行了),这里讲的是链式二叉树的静态造法(先造ABCD节点,然后把各自指针域相连就行了)
*	2016年6月20日12:23:21
*/

struct BTNode* CreateBTree();	//创建一个二叉树,返回一个根节点指针
void PreTraverseBTree(struct BTNode*);	//前序遍历输出二叉树
void InTraverseBTree(struct BTNode*);	//中序遍历输出二叉树
void PostTraverseBTree(struct BTNode*);	//后序遍历输出二叉树

struct BTNode
{
	struct BTNode* pLchild;
	struct BTNode* pRchild;
	char data;
};

int main(void)
{
	struct BTNode* pT = CreateBTree();

	PreTraverseBTree(pT);
	printf("\n");

	InTraverseBTree(pT);
	printf("\n");

	PostTraverseBTree(pT);
	printf("\n");

	return 0;
}

struct BTNode* CreateBTree()		//当这个函数调用完后,pT变量释放了,但是动态生成的内存还有!
{
	struct BTNode* pA = (struct BTNode*)malloc(sizeof(struct BTNode));
	struct BTNode* pB = (struct BTNode*)malloc(sizeof(struct BTNode));
	struct BTNode* pC = (struct BTNode*)malloc(sizeof(struct BTNode));
	struct BTNode* pD = (struct BTNode*)malloc(sizeof(struct BTNode));
	struct BTNode* pE = (struct BTNode*)malloc(sizeof(struct BTNode));	//创建节点

	pA->data = 'A';
	pB->data = 'B';
	pC->data = 'C';
	pD->data = 'D';
	pE->data = 'E';		//给节点赋值

	pA->pLchild = pB;
	pA->pRchild = pC;

	pB->pLchild = pB->pRchild = NULL;

	pC->pLchild = pD;
	pC->pRchild = NULL;

	pD->pLchild = NULL;
	pD->pRchild = pE;

	pE->pLchild = pE->pRchild = NULL;	//连起来
	
	return pA;	//返回根节点
}

/**	先访问根节点; 再前序访问左子树; 再前序访问左子树;*/
void PreTraverseBTree(struct BTNode* pT)	//前序遍历输出二叉树
{
	if(NULL != pT)
	{
		printf("%c ", pT->data);

		if(NULL != pT->pLchild)
		PreTraverseBTree(pT->pLchild);

		if(NULL != pT->pRchild)		//这里的两个if可以不加,不影响结果,但影响性能!加了if好,因为这样在调用函数之前就判断指针域是否为空,如果为空就不调用了,省时间,不用等调用后再判断然后退出函数!
		PreTraverseBTree(pT->pRchild);	
	}
}

void InTraverseBTree(struct BTNode* pT)	//中序遍历输出二叉树
{
	if(NULL != pT)
	{
		if(NULL != pT->pLchild)
		InTraverseBTree(pT->pLchild);

		printf("%c ", pT->data);

		if(NULL != pT->pRchild)		//这里的两个if可以不加,不影响结果,但影响性能!加了if好,因为这样在调用函数之前就判断指针域是否为空,如果为空就不调用了,省时间,不用等调用后再判断然后退出函数!
		InTraverseBTree(pT->pRchild);	
	}
}

void PostTraverseBTree(struct BTNode* pT)	//后序遍历输出二叉树
{
	if(NULL != pT)
	{
		if(NULL != pT->pLchild)
		PostTraverseBTree(pT->pLchild);

		if(NULL != pT->pRchild)		//这里的两个if可以不加,不影响结果,但影响性能!加了if好,因为这样在调用函数之前就判断指针域是否为空,如果为空就不调用了,省时间,不用等调用后再判断然后退出函数!
		PostTraverseBTree(pT->pRchild);	

		printf("%c ", pT->data);
	}
}

定义的二叉树与输出结果:

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值