二叉树建立和遍历
2015-09-18 10:41
459 查看
#include "stdio.h"
#include "string.h"
#include "malloc.h"
#define NULL 0
typedef struct BiTNode{ //定义数据结构
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
BiTree Create(BiTree T) //建立二叉树
{
char ch;
ch=getchar();
if(ch=='#')
T=NULL;
else
{
if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))
printf("Error!");
T->data=ch;
T->lchild=Create(T->lchild);
T->rchild=Create(T->rchild);
}
return T;
}
void Preorder(BiTree T)
{ //先序遍历二叉树
if(T)
{
printf("%c",T->data);
Preorder(T->lchild);
Preorder(T->rchild);
}
}
int Sumleaf(BiTree T)
{ //求叶子节点的个数
int sum=0,m,n;
if(T)
{
if((!T->lchild)&&(!T->rchild))
sum++;
m=Sumleaf(T->lchild);
sum+=m;
n=Sumleaf(T->rchild);
sum+=n;
}
return sum;
}
void zhongxu(BiTree T)
{
if(T)
{
zhongxu(T->lchild);
printf("%c",T->data);
zhongxu(T->rchild);
}
}
void houxu(BiTree T)
{ //后续遍历
if(T)
{
houxu(T->lchild);
houxu(T->rchild);
printf("%c",T->data);
}
}
int Depth(BiTree T) //求二叉树的深度
{
int dep=0,depl,depr;
if(!T) dep=0;
else
{
depl=Depth(T->lchild);
depr=Depth(T->rchild);
dep=1+(depl>depr?depl:depr);
}
return dep;
}
void main()
{
BiTree T;
int sum,dep;
T=Create(T);
Preorder(T);
printf("\n");
zhongxu(T);
printf("\n");
houxu(T);
printf("\n");
sum=Sumleaf(T);
printf("%d",sum);
dep=Depth(T);
printf("\n%d",dep);
}
例如输入序列ABC##DE#G##F###(其中的“#”表示空,并且输入过程中不要加回车,因为回车也有对应的ASCII码,是要算字符的,但是输入 完之后可以按回车退出),这时候就能够看到结果了。
另外你必须会手动建立一棵二叉树,保证你输入的序列能构成一棵二叉树,否则你怎么输入,按最后按多少回车程序也不会结束!
下面是我举的例子的二叉树的图形表示,如果可能,把你想建立的二叉树也发上来!
#include "string.h"
#include "malloc.h"
#define NULL 0
typedef struct BiTNode{ //定义数据结构
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
BiTree Create(BiTree T) //建立二叉树
{
char ch;
ch=getchar();
if(ch=='#')
T=NULL;
else
{
if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))
printf("Error!");
T->data=ch;
T->lchild=Create(T->lchild);
T->rchild=Create(T->rchild);
}
return T;
}
void Preorder(BiTree T)
{ //先序遍历二叉树
if(T)
{
printf("%c",T->data);
Preorder(T->lchild);
Preorder(T->rchild);
}
}
int Sumleaf(BiTree T)
{ //求叶子节点的个数
int sum=0,m,n;
if(T)
{
if((!T->lchild)&&(!T->rchild))
sum++;
m=Sumleaf(T->lchild);
sum+=m;
n=Sumleaf(T->rchild);
sum+=n;
}
return sum;
}
void zhongxu(BiTree T)
{
if(T)
{
zhongxu(T->lchild);
printf("%c",T->data);
zhongxu(T->rchild);
}
}
void houxu(BiTree T)
{ //后续遍历
if(T)
{
houxu(T->lchild);
houxu(T->rchild);
printf("%c",T->data);
}
}
int Depth(BiTree T) //求二叉树的深度
{
int dep=0,depl,depr;
if(!T) dep=0;
else
{
depl=Depth(T->lchild);
depr=Depth(T->rchild);
dep=1+(depl>depr?depl:depr);
}
return dep;
}
void main()
{
BiTree T;
int sum,dep;
T=Create(T);
Preorder(T);
printf("\n");
zhongxu(T);
printf("\n");
houxu(T);
printf("\n");
sum=Sumleaf(T);
printf("%d",sum);
dep=Depth(T);
printf("\n%d",dep);
}
例如输入序列ABC##DE#G##F###(其中的“#”表示空,并且输入过程中不要加回车,因为回车也有对应的ASCII码,是要算字符的,但是输入 完之后可以按回车退出),这时候就能够看到结果了。
另外你必须会手动建立一棵二叉树,保证你输入的序列能构成一棵二叉树,否则你怎么输入,按最后按多少回车程序也不会结束!
下面是我举的例子的二叉树的图形表示,如果可能,把你想建立的二叉树也发上来!
相关文章推荐
- codeforces #315B. Symmetric and Transitive dp
- Appium 测试,实现上下左右滑动页面
- js去掉文本前后空格与阻止表单提交
- 如何判断用户是否登录
- 引用与指针的异同-基础篇
- ASP.NET如何使用JSON
- 脚本乐园 shell 中对小数进行比较的方法总结
- Linux操作系统中FastDFS部署手册
- First Bad Version
- 20-EMM Procedure 8&9. Handover & Cell Reselection with TAU
- puremvc 入门与思考
- centos安装locate
- IOS -- iOS 8 CoreLocation 中状态栏(StatusBar)的细节问题
- android system.prop使用(1)
- 谭浩强是脑残的精神领袖吗?
- puremvc 入门与思考
- linux下查看进程内存使用情况
- [LeetCode] ZigZag Conversion
- jquery实现隐藏在左侧的弹性弹出菜单效果
- ABBYY FlexiCapture 帮助韩国商人申请产品专利