修复后的代码如下:

#include<stdio.h>
#include<stdlib.h>
typedef char elem;
typedef struct node {
    elem data;
    struct node *lchild;
    struct node *rchild;
} Btnode;
void createtree(Btnode *&T,char *&str)
{
    Btnode *st[20],*p;
    int top =-1,k,j=0;
    char ch;
    T=NULL;
    ch=str[j];
    while(ch!='\0') {
        switch(ch) {
        case '(':
            top++;
            st[top]=p;
            k=1;
            break;
        case ',':
            k=2;
            break;
        case ')':
            top-- ;
            break;
        default :
            p=(Btnode *)malloc(sizeof(Btnode));
            p->data=ch;
            p->lchild=p->rchild=NULL;
            if(T==NULL)
                T=p;
            else
                switch(k)
                {
                case 1:
                    st[top]->lchild=p;
                    break;
                case 2:
                    st[top]->rchild=p;
                    break;
                }
        }
        j++;
        ch=str[j];
    }
}

void destroytree(Btnode *&L)
{
    if(L!=NULL)
    {
        destroytree(L->lchild);
        destroytree(L->rchild);
        free(L);
    }
}

void visit(Btnode *&L)
{
    if(L!=NULL)
    {
        visit(L->lchild);
        printf("%c",L->data);
        visit(L->rchild);
    }
}

int main()
{
    Btnode *B;
    char *p, a[]="A(B(C,D))1";
    p=a;
    createtree(B,p);
    visit(B);
    destroytree(B);
    return 0;
}

修复的地方包括:

  1. 在创建树的过程中,设置节点的左右子树指针时,将p->lchild=p->lchild=NULL改为p->lchild=p->rchild=NULL
  2. 在后序遍历的visit函数中,调整递归顺序,先递归遍历左子树,再打印节点数据,最后递归遍历右子树。

此外,还取消了注释部分的代码,因为这部分是销毁树的函数,如果在主函数中调用了销毁函数,再调用遍历函数就会出现问题

#includestdioh#includestdlibhtypedef char elem;typedef struct node elem data; struct node lchild; struct node rchild; Btnode;void createtreeBtnode &Tchar &str Btnode st20p; int top =-1

原文地址: http://www.cveoy.top/t/topic/iow4 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录