#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
修复后的代码如下:
#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;
}
修复的地方包括:
- 在创建树的过程中,设置节点的左右子树指针时,将
p->lchild=p->lchild=NULL改为p->lchild=p->rchild=NULL。 - 在后序遍历的
visit函数中,调整递归顺序,先递归遍历左子树,再打印节点数据,最后递归遍历右子树。
此外,还取消了注释部分的代码,因为这部分是销毁树的函数,如果在主函数中调用了销毁函数,再调用遍历函数就会出现问题
原文地址: http://www.cveoy.top/t/topic/iow4 著作权归作者所有。请勿转载和采集!