c语言非递归方式建立二叉链表,非递归算法遍历二叉树,改成用链表的怎么破?链表不熟智商拙计...

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

#include

#include

#include

#include

#define OVERFLOW -1

struct BTNode{

char data;

struct BTNode *lchild,*rchild;

};

struct BTNode *CreatBiTree(){ //先序建立二叉树

struct BTNode *T;

char ch;

scanf("%c",&ch);

if (ch==' ')

T=NULL;

else{

if(!(T=(struct BTNode*)malloc(sizeof(struct BTNode))))

exit(OVERFLOW);

T->data =ch;

T->lchild = CreatBiTree();

T->rchild = CreatBiTree();

}

return T;

}

PreOrderTraverse(struct BTNode *T){ //先序遍历二叉树

struct BTNode * A[30]; //定义一个数组存二叉树类型的指针

int i=0;

if(T!=NULL){ //先在数组内存上指向T的根节点的指针 将T赋值为T的左子树

A[i]=T;

printf("%c",T->data);i++;

T=T->lchild;

}

while(i>=0){ //数组不为空的时候

if(T!=NULL){ //树不空,则输出此根节点存的数据 将T赋值为T的左子树

A[i]=T;

printf("%c",T->data);i++;

T=T->lchild ;

}

else{

printf("/"); //树为空 则输出表示空的字符“/”

if(i>0){ //判断下标是否越界 将T赋值为T的根节点的右子树

i--;

T=A[i]->rchild;

}

else break;

}

}

}

InOrderTraverse(struct BTNode *T){

struct BTNode * A[30];

int i=0;

if(T!=NULL){

A[i]=T;i++;

T=T->lchild;

}

while(i>=0){

if(T!=NULL){

A[i]=T;i++;

T=T->lchild ;

}

else{

printf("/");

if(i>0){

printf("%c",A[i-1]->data);

i--;

T=A[i]->rchild;

}

else break;

}

}

}

PostOrderTraverse(struct BTNode *T){

struct BTNode * A[30]; //定义一个数组存二叉树类型的指针

int B[30]; //定义了一个数组 用于保存标识根节点的状态的标识符 “0”表示此根节点还没被访问过子树,1表示已经访问过左子树,2表示已经访问过右子树

int i=0;

if(T!=NULL){ //初始化数组 将树的根节点存入数组 标识符初始化为 “0”

A[i]=T;B[i]=0;i++;

}

while(i>=0){

if(T==NULL){ //树为空时 输出表示空的字符 返回上一层的根节点

printf("/");

T=A[i-2];i--;

}

else{

if(i>0){

switch (B[i-1]){

case 0: //为“0”时 访问左子树 并将根节点的标识符设为“1”,将其左子树的根节点存入数组,将左子树的标识符设为“0”

A[i]=T->lchild;B[i]=0;

B[i-1]=1;i++;

T=T->lchild;

break;

case 1: //为“1”时 访问右子树 并将根节点的标识符设为“2”,将其右子树的根节点存入数组,将右子树的标识符设为“0”

A[i]=T->rchild;B[i]=0;

B[i-1]=2;i++;

T=T->rchild;

break;

case 2: //为“2”时 输出根节点的数据 并返回上一层的根节点

printf("%c",A[i-1]->data);

T=A[i-2];i--;

}

}

else break;

}

}

}

void main(){

struct BTNode *T;

printf("请按先序输入二叉树值,空用空格代替\n");

T=CreatBiTree();

printf("先序遍历二叉树得到的结果为:\n");

PreOrderTraverse(T);

printf("\n中序遍历二叉树得到的结果为:\n");

InOrderTraverse(T);

printf("\n后序遍历二叉树得到的结果为:\n");

PostOrderTraverse(T);

getch();

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值