注册 登录
编程论坛 数据结构与算法

这个二叉树的后续遍历为什么不出循环?(先序构造)

梦寻 发布于 2018-12-28 21:14, 2127 次点击
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
    char data;
    struct Node *LChild;
    struct Node *RChild;
}BiNode,*Bitree;
Bitree s2[10],s3[10];
char s1[10];
void CreateBitree(Bitree *bt)
{
    (*bt)=(Bitree)malloc(sizeof(BiNode));
    (*bt)->LChild=NULL; (*bt)->RChild=NULL;
    int top=1;
    Node *p;
    p=*bt;
    char ch;
    ch=getchar();
    s1[top]=ch;
    s2[top]=p;
    do
    {
        while((ch=getchar())!=' ')
        {
            if(ch=='\n') break;
            top++;
            if(p->LChild!=NULL)
            {
            p->RChild=(Bitree)malloc(sizeof(BiNode));
            p=p->RChild; p->LChild=NULL; p->RChild=NULL;
            }
            else{
            p->LChild=(Bitree)malloc(sizeof(BiNode));
            p=p->LChild; p->LChild=NULL; p->RChild=NULL;
               
            }
            s2[top]=p;
            s1[top]=ch;
        }
        if(top!=0)
        {
            p=s2[top];
            p->data=s1[top];
            top--;
        }
    }while(ch!='\n');
}
void PostOrder(Bitree root)
{
    Bitree p=root,m;
    int top=0;  s3[0]=NULL;
    do
    {
        while(p!=NULL)
        {
            top++;  
            s3[top]=p;
            p=p->LChild;
        }
        if(top!=0)
        {
            p=s3[top];
           while(p->RChild==NULL)
           {
                 printf("%c  ",p->data,top);
                 top--;
                 m=p;
                 p=s3[top];
            }   
            if(p->RChild!=NULL)
            {
                while(p->RChild==m&&top!=0)
                {
                     printf("%c  ",p->data,top);
                     top--;  
                     m=p;
                     p=s3[top];  
                }
                if(p!=NULL&&p->RChild!=m)
                {
                    p=p->RChild;
                }
            }
        }  
    }while(p!=NULL||top!=0);
     printf("出循环!");
}
int main()
{
    Bitree root;
    CreateBitree(&root);
    printf("\n后序遍历:");
    PostOrder( root);
 }
1 回复
#2
梦寻2018-12-29 00:04
已找到答案:当p=NULL时,运行会卡在p->RChile这里不动,所以出不了循环。
1