[转]二叉树的建立和遍历

#include "stdio.h"
#include "stdlib.h"
#define Maxsize 100;

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

BT *CreatBT ();
void preorder (BT * T);
void inorder (BT * T);
void postorder (BT * T);
void leafnum (BT * T);
void ShowTree (BT * T);
void Nodenum (BT * T);

int main (void)
{
BT *T = NULL;
int choice;
do
{
printf ("\n");
printf (" 二叉树 \n");
printf (" ***************************\n");
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 (" ****************************\n");
printf (" 请输入您的选择(1,2,3,4,5,6,7,8): \n");
scanf ("%d", &choice);
if (choice == 1)
{
printf
("二叉树的建立,以输入“0”表示结束:!\n");
printf ("请输入根结点:\n");
T = CreatBT ();
printf ("二叉树成功建立");
}
else if (choice == 2)
{
printf ("先序遍历二叉树 :\n");
preorder (T);
}
else if (choice == 3)
{
printf ("中序遍历二叉树:\n");
inorder (T);
}
else if (choice == 4)
{
printf ("后序遍历二叉树 :\n ");
postorder (T);
}
else if (choice == 5)
{
printf (" 二叉树的叶子结点数为 : \n");
leafnum (T);
}
else if (choice == 6)
ShowTree (T);
else if (choice == 7)
{
Nodenum (T);
}
else if (choice == 8)
exit (0);
}
while (choice <= 8);
}                              

BT *
CreatBT ()                       //建立二叉树
{
BT *t;
int x;
scanf ("%d", &x);
//getchar();
if (x == 0)
{
t = NULL;
}
else
{
t = (BT *) malloc (sizeof (BT));
t->data = x;
printf ("\n请输入%d结点的左子结点:", t->data);
t->lch = CreatBT ();
printf ("\n请输入%d结点的右子结点:", t->data);
t->rch = CreatBT ();
}
return t;
}

void
preorder (BT * T)
{
if (T == NULL)
return;
else
{
printf ("=", T->data);
preorder (T->lch);
preorder (T->rch);
}
}

void
inorder (BT * T)
{
if (T == NULL)
return;
else
{
inorder (T->lch);
printf ("=", T->data);
inorder (T->rch);
}
}

void
postorder (BT * T)
{
if (T == NULL)
return;
else
{
postorder (T->lch);
postorder (T->rch);
printf ("=", T->data);
}
}

void
leafnum (BT * T)
{
int count = 0;
if (T)
{
if (T->lch == NULL && T->rch == NULL)
count++;
leafnum (T->lch);
leafnum (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 Nodenum (BT * T)
{
static int count = 0;
if (T)
{
count++;
Nodenum (T->lch);
Nodenum (T->rch);
}
else {
printf ("该二叉树总共有%d个结点。\n", count);
}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值