递归遍历二叉树

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 二叉链表表示法
typedef struct tag_BiTNode
{
	struct tag_BiTNode *lchild;	// 左孩子
	struct tag_BiTNode *rchild;	// 右孩子
	char data;	// 数据
}BiTNode;


// 先序遍历
void xianxuOrder(BiTNode * root)
{
	// 空树 递归结束的条件
	if (root == NULL)
	{
		return;
	}
	// 先根
	printf("%c  ", root->data);
	// 左子树
	xianxuOrder(root->lchild);
	// 右子树
	xianxuOrder(root->rchild);
}

// 中序遍历
void zhongxuOrder(BiTNode* root)
{
	// 空
	if (root == NULL)
	{
		return;
	}
	// 左子树
	zhongxuOrder(root->lchild);
	// 根节点
	printf("%c  ", root->data);
	// 右子树
	zhongxuOrder(root->rchild);
	
}

// 后序遍历
void houxuOrder(BiTNode* root)
{
	// 空
	if (root == NULL)
	{
		return;
	}
	// 左子树
	houxuOrder(root->lchild);
	// 右子树
	houxuOrder(root->rchild);
	// 根节点
	printf("%c  ", root->data);
}


// 求树的叶子节点数
int num = 0;
void leafNum(BiTNode* root)
{
	// 空树
	if (root == NULL)
	{
		return;
	}
	// 叶子节点
	if (root->lchild == NULL && root->rchild == NULL)
	{
		num++;
	}
	// 遍历左子树
	leafNum(root->lchild);
	// 右子树
	leafNum(root->rchild);
}

void leafNum_plus(BiTNode* root, int *num)
{
	// 空树
	if (root == NULL)
	{
		return;
	}
	// 叶子节点
	if (root->lchild == NULL && root->rchild == NULL)
	{
		(*num)++;
	}
	// 遍历左子树
	leafNum_plus(root->lchild, num);
	// 右子树
	leafNum_plus(root->rchild, num);
}

int leafNum_plus2(BiTNode* root)
{
	// 空树
	if (root == NULL)
	{
		return 0;
	}
	if (root->lchild == NULL && root->rchild == NULL)
	{
		printf(" %c  ", root->data);
		return 1;
	}
	int left = leafNum_plus2(root->lchild);
	int right = leafNum_plus2(root->rchild);

	return left + right;
}




void main()
{
	BiTNode nodeA, nodeB, nodeC, nodeD, nodeE, nodeF, nodeG;
	memset(&nodeA, 0, sizeof(BiTNode));
	memset(&nodeB, 0, sizeof(BiTNode));
	memset(&nodeC, 0, sizeof(BiTNode));
	memset(&nodeD, 0, sizeof(BiTNode));
	memset(&nodeE, 0, sizeof(BiTNode));
	memset(&nodeF, 0, sizeof(BiTNode));
	memset(&nodeG, 0, sizeof(BiTNode));

	// 赋值
	nodeA.data = 'A';
	nodeA.lchild = &nodeB;
	nodeA.rchild = &nodeC;

	nodeB.data = 'B';
	nodeB.lchild = &nodeD;
	nodeB.rchild = &nodeE;

	nodeC.data = 'C';
	nodeC.lchild = &nodeF;
	nodeC.rchild = &nodeG;

	nodeD.data = 'D';
	nodeE.data = 'E';
	nodeF.data = 'F';
	nodeG.data = 'G';

	// 先序
	printf("先序遍历: \n");
	xianxuOrder(&nodeA);
	printf("\n");

	// 中序
	printf("中序遍历: \n");
	zhongxuOrder(&nodeA);
	printf("\n");


	// hou序
	printf("后序遍历: \n");
	houxuOrder(&nodeA);
	printf("\n");

	leafNum(&nodeA);
	printf("叶子节点数: %d\n", num);

	int nuber = 0;
	leafNum_plus(&nodeA, &nuber);
	printf("叶子节点数_plus: %d\n", nuber);

	nuber = leafNum_plus2(&nodeA);
	printf("叶子节点数_plus: %d\n", nuber);




	system("pause");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值