二叉树的遍历程序 c语言,快帮忙写个遍历二叉树的程序

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

刚好我也在做这个作业,借你一用,你自己最好还是好好研究下吧,还是自己写这样才有进步的。

#include

#include

#include

#define M 30

typedef char Elemtype;

typedef struct BiTNode {

Elemtype data;

struct BiTNode *LChild,*RChild;

}BiTNode;

BiTNode* s[M]; //作为储存根结点的指针使用

//初始化二叉树

void InitBTree(BiTNode **T)

{

*T=NULL; //把树根指针置空

}

//按用户的输入创建二叉树

void createbitree(BiTNode **T,char *a)

{

int k; //作为判断左右子树的标记

int i=0; //树组a的下 标

int top=0; //指示S数组,初值为-1,表示空的

BiTNode *p;

*T=NULL;

while (a[i]!='\0')

{

switch (a[i]) {

case ' ':

break; //对空格什么也不做

case '(':

if (top==M-1) {

printf("数组太小,请增加M\n");

exit (1);

}

top++;s[top]=p;k=1;

break;

case ')' :

if (top==-1) {

printf("输入格式错误!\n");

exit (1);

}

top--;

break;

case ',':

k=2; //开始右子树

break;

default:

p=(BiTNode *) malloc (sizeof(BiTNode));

p->data=a[i];

p->LChild = p->RChild =NULL;

if (*T==NULL) *T=p; //第一个结点作为树根

else {

if (k==1)

s[top]->LChild=p;

else

s[top]->RChild=p;

}

break;

}

i++; //扫描下一个字符

}

}

//清空二叉树

void cleartree(BiTNode **T)

{

if (*T!=NULL) {

cleartree(&((*T)->LChild));

cleartree(&((*T)->RChild));

free(*T);

*T=NULL;

}

}

//检查二叉数是否为空

int treeempty(BiTNode *T)

{

if (T!=NULL)

return 1;

else

return 0;

}

//递归前序遍历

void preorder(BiTNode *T)

{

if (T!=NULL) {

printf("%c ",T->data); //先访问根结点

preorder(T->LChild); //遍历左子树

preorder(T->RChild); //遍历右子树

}

}

//递归后序遍历

void postorder(BiTNode *T)

{

if (T!=NULL) {

postorder(T->LChild); //遍历左子树

postorder(T->RChild); //遍历右子树

printf("%c ",T->data); //后访问根结点

}

}

//中序非递归遍历

void inorder(BiTNode *T)

{

int top=1;

//BiTNode* s[M]; //S作为存结点的栈使用

BiTNode *p;

s[top]=T;

while (top!=0) {

p=s[top];

while( s[top]!=NULL&&p!=NULL ) { // 向左走到尽头

s[++top]=p->LChild;

p=p->LChild;

}

top--; //空指针退栈

if (top!=0) { //访问结点,向右走一步

printf("%c ",s[top]->data);

s[top]=s[top]->RChild;

}

}

}

//按层次遍历树

void levelorder(BiTNode *T)

{

BiTNode *p;

int front=0,rear=0; //利用BiTnode *s[m],当队列用

if (T!=NULL) { //树根入队列

rear = (rear+1)%M; //第一层是根,先访问,所以它是队头

s[rear]=T;

}

while (rear!=front) {

front=(front+1)%M;

p=s[front]; //删除队头元素(下一步队头指向front+1,会被覆盖)

printf("%c ",p->data); //输出队头元素所指的结点值

if (p->LChild!=NULL) {

rear=(rear+1)%M; //如果有左孩子,那就入队

s[rear]=p->LChild;

}

if (p->RChild!=NULL) {

rear=(rear+1)%M; //如果有右孩子,那就入队

s[rear]=p->RChild;

}

}

}

//求二叉数的深度

int deeptree(BiTNode *T)

{

if (T==NULL) return 0;

if (T->LChild==NULL&&T->RChild==NULL) return 1;

if (deeptree(T->LChild)>deeptree(T->RChild))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值