二叉树的非递归遍历

来源:互联网 发布:万网解析域名设置 编辑:程序博客网 时间:2024/06/08 15:10

二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序遍历、中序遍历以及后序遍历三种遍历方法。对于树的遍历若采用非递归的方法,就要采用栈和队列加以实现。

简单定义

#include<stdio.h>#include<malloc.h>#define MAX_STRING_SIZE 10240typedef struct BTNode{    char data;    struct BTNode *lchild,*rchild;}BTNode, *BiTree;int x;

创建树

BiTree CreateTree(char s[]){    BiTree T;    char ch=s[x++];    if(ch=='\0'){        return NULL;    }    if(ch=='#'){        return NULL;    }    T=(BiTree)malloc(sizeof(struct BTNode));    T->data=ch;    T->lchild=CreateTree(s);    T->rchild=CreateTree(s);    return T;}

中序非递归

void InOrder(BiTree T){    BiTree stack[MAX_STRING_SIZE];    int top=-1;    if(!T){        return;    }    while(true){        while(T){            stack[++top]=T;            T=T->lchild;        }        if(top<0){            break;        }        T=stack[top--];        printf("%c",T->data);        T=T->rchild;    }}

中序非递归

void InOrder(BiTree T){    BiTree stack[MAX_STRING_SIZE];    int top=-1;    if(!T){        return;    }    while(true){        while(T){            stack[++top]=T;            T=T->lchild;        }        if(top<0){            break;        }        T=stack[top--];        printf("%c",T->data);        T=T->rchild;    }}

层次遍历

void LevelOrder(BiTree T){    BiTree que[MAX_STRING_SIZE];    int font, rear;    font=rear=-1;    if(!T){        return;    }    que[++rear]=T;    while(font<rear){        T=que[++font];        printf("%c",T->data);        if(T->lchild){            que[++rear]=T->lchild;        }        if(T->rchild){            que[++rear]=T->rchild;        }    }}

主函数

int main(){    char s[MAX_STRING_SIZE];    x=0;    scanf("%s",s);    BiTree T=CreateTree(s);    InOrder(T);    printf("\n");    LevelOrder(T);    return 0;}

运行结果
这里写图片描述
希望对你们能有所帮助。

0 0
原创粉丝点击