二叉树遍历非递归算法

来源:互联网 发布:淘宝退货物流信息填错 编辑:程序博客网 时间:2024/05/29 04:07

 输入代码:

#include <stdio.h>#include <malloc.h>#define MaxSize 100typedef char ElemType;using namespace std;typedef struct node{    ElemType data;    struct node *lchild;    struct node *rchild;} BTNode;/*建立二叉树*/void CreateBTNode(BTNode *&b,char *str){    BTNode *St[MaxSize],*p;    int top=-1,k,j=0;    char ch;    b=NULL;    ch=str[j];    while(ch!='\0')    {        switch(ch)        {        case '(':            top++;            St[top]=p;            k=1;            break;        case ')':            top--;            break;        case ',':            k=2;            break;        default:            p=(BTNode *)malloc(sizeof(BTNode));            p->data=ch;            p->lchild=p->rchild=NULL;            if(b==NULL)                b=p;            else            {                switch(k)                {                case 1:                    St[top]->lchild=p;                    break;                case 2:                    St[top]->rchild=p;                    break;                }            }        }        j++;        ch=str[j];    }}void PreOrder1(BTNode *b)   //先序非递归遍历算法{    BTNode *St[MaxSize],*p;    int top=-1;            //根节点进栈    if(b!=NULL)    {        top++;        St[top]=b;        while(top>-1)    //栈不为空时进栈        {            p=St[top];    //退栈并访问该节点            top--;            printf("%c",p->data);            if(p->rchild!=NULL)  //右孩子节点进栈            {                top++;                St[top]=p->rchild;            }            if(p->lchild!=NULL)   //左孩子节点进栈            {                top++;                St[top]=p->lchild;            }        }        printf("\n");    }}void InOrder(BTNode *b)   //中序遍历非递归算法{    BTNode *St[MaxSize],*p;    int top=-1;    if(b!=NULL)    {        p=b;        while(top>-1||p!=NULL)   //处理*b节点的左子树        {            while(p!=NULL)     //扫描*p的所有左节点并进栈            {                top++;                St[top]=p;                p=p->lchild;            }            //执行到此处时,栈顶元素没有左孩子或左子树均已访问过            if(top>-1)            {                p=St[top];   //出栈*p节点                top--;                printf("%c",p->data);   //访问之                p=p->rchild;    //转向处理*p的右孩子节点            }        }        printf("\n");    }}void PostOrder(BTNode *b)   //后序遍历的非递归算法{    BTNode *St[MaxSize],*p;    int top=-1,flag;    if(b!=NULL)    {        do        {            while(b!=NULL)     //扫描*p的所有左节点并进栈            {                top++;                St[top]=b;                b=b->lchild;            }            //执行到此处时,栈顶元素没有左孩子或者左子树均已访问过            p=NULL;        //p指向栈顶节点的前一个已访问过的节点            flag=1;        //表示*b的左孩子已访问或为空            while(top!=-1&&flag)            {                b=St[top];    //取出当前栈顶元素                if(b->rchild==p)                    /*                    若*p=NULL,表示b的右孩子不存在,而其左子树不存在或已访问,可以访问*b;                    若*p!=NULL,表示b的右子树已访问,可以访问*b。                    */                {                     printf("%c",b->data);                    top--;                    p=b;                }                else                {                    b=b->rchild;                    flag=0;                }            }        }        while(top!=-1);         printf("\n");    }}int main(){    BTNode *b;    CreateBTNode(b,"A(B(D(,G)),C(E,F))");    printf("先序遍历:");    PreOrder1(b);    printf("中序遍历:");    InOrder(b);    printf("后序遍历:");    PostOrder(b);    return 0;}


运行截图:


1 0
原创粉丝点击