递归建立和遍历二叉树等

// Recursion.cpp : 定义控制台应用程序的入口点。 技术交流,请上<a target=_blank href="http://wenwen.website/">问问分享平台</a>。
//
#include "stdafx.h"
#include <malloc.h>

typedef int ElemType;

typedef struct BT
{
	ElemType data;
	struct BT *lch, *rch;
} BT;

BT *CreateBT();
void PreorderTraversal(BT *T);
void InTraversal(BT *T);
void Postorder(BT *T);
void GetLeafNum(BT *T);
void ShowTree(BT *T);
void GetNodeNum(BT *T);


int _tmain(int argc, _TCHAR* argv[])
{
	BT *T = NULL;
	int choice;

	do
	{
		printf("\n");
		printf(" 二叉树 \n");
		printf(" *****************************");
		printf(" * *\n");
		printf(" * 主菜单 *\n");
		printf(" * 1 建立二叉树 *\n");
		printf(" * 2 先序遍历二叉树 *\n");
		printf(" * 3 中序遍历二叉树 *\n");
		printf(" * 4 后序遍历二叉树 *\n");
		printf(" * 5 二叉树叶子节点数目 *\n");
		printf(" * 6 显示二叉树 *\n");
		printf(" * 7 二叉树所有节点数 *\n");
		printf(" * 8 退出程序 *\n");
		printf("*****************************");
		printf(" 请您选择操作(1,2......8)");
		scanf_s("%d", &choice);
		if (choice == 1)
		{
			printf("二叉树建立,以输入0表示结束:!\n");
			printf("请输入跟节点:\n");
			T = CreateBT();
			printf("二叉树建立成功");
		}
		else if (choice == 2)
		{
			printf("先序遍历二叉树:\n");
			PreorderTraversal(T);
		}
		else if (choice == 3)
		{
			printf("中序遍历二叉树:\n");
			InTraversal(T);
		}
		else if (choice == 4)
		{
			printf("后续遍历二叉树:\n");
			Postorder(T);
		}
		else if (choice == 5)
		{
			printf("二叉树叶子节点数目:\n");
			GetLeafNum(T);
		}
		else if (choice == 6)
		{
			printf("查看二叉树:\n");
			ShowTree(T);
		}
		else if (choice == 7)
		{
			int count = 0;
			GetNodeNum(T);
			printf("该二叉树共有%d个节点", count);
		}
		else {

		}
	} while (choice <= 8);

	getchar();
	return 0;
}

// 建立二叉树
BT *CreateBT()
{
	BT *t;
	int x;
	scanf_s("%d", &x);

	if (x == 0)
	{
		t = NULL;
	}
	else
	{
		t = (BT*)malloc(sizeof(BT));
		t->data = x;
		printf("\n请输入%d节点的左子节点", t->data);
		t->lch = CreateBT();
		printf("\n请输入%d节点的右子节点", t->data);
		t->rch = CreateBT();
	}

	return t;
}

// 前序遍历
void PreorderTraversal(BT *T)
{
	if (T == NULL)
	{
		return;
	}
	else
	{
		printf("%3d", T->data);
		PreorderTraversal(T->lch);
		PreorderTraversal(T->rch);
	}
}

// 中序遍历
void InTraversal(BT *T)
{
	if (T == NULL)
	{
		return;
	}
	else
	{
		InTraversal(T->lch);
		printf("%3d", T->data);
		InTraversal(T->rch);
	}
}

// 后序遍历
void Postorder(BT *T)
{
	if (T == NULL)
	{
		return;
	}
	else
	{
		Postorder(T->lch);
		Postorder(T->rch);
		printf("%3d", T->data);
	}
}

// 获取叶子数
void GetLeafNum(BT *T)
{
	int count = 0;
	if (T)
	{
		if (T->lch == NULL&&T->rch == NULL)
			count++;
		GetLeafNum(T->lch);
		GetLeafNum(T->rch);
	}
	printf("%d", count);
}

// 显示二叉树
void ShowTree(BT *T)
{
	BT *stack[100];
	BT*p;
	int level[100][2];
	int top, n, i;
	int width = 4;
	if (T != NULL)
	{
		printf("\n二叉树的表示法f:\n");
		top = 1;
		stack[top] = T;
		level[top][0] = width;
		while (top > 0)
		{
			p = stack[top];
			n = level[top][0];
			for (i = 1; i <= n; i++)
				printf(" ");
			printf("%d", p->data);
			for (i = n + 1; i < 60; i += 2)
				printf("*");
			printf("\n\t\t");
			top--;
			if (p->rch != NULL)
			{
				top++;
				stack[top] = p->rch;
				level[top][0] = n + width;
				level[top][1] = 2;
			}
			if (p->lch != NULL)
			{
				top++;
				stack[top] = p->lch;
				level[top][0] = n + width;
				level[top][1] = 1;
			}
		}
	}
}

// 计算节点数
void GetNodeNum(BT *T)
{
	int count = 0;
	if (T) count++;
	GetNodeNum(T->lch);
	GetNodeNum(T->rch);

	printf("%d", count);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值