// 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);
}