我试图使用指针实现二叉树,然后我必须使用堆栈从后缀表达式创建一个新的二叉树(并打印它)。
函数“create”应该这样做,但每次它到达StTop或StPop时,程序都会停止工作。
我的函数得到字符串,然后对每个字符c做如下操作:如果c是一个字母,那么它创建一个二叉树,它的根是c,它的孩子是NULL,并把它放在堆栈“niz”的顶部。
否则使用Stack,它从Stack中弹出last和second to last值,并创建新树,其中char c是根,last值是右子,second to last是左子,并将其放回Stack顶部。
我不知道我做错了什么。每一个提示或建议将不胜感激!
#include<stdio.h>
#include<stdlib.h>
#define LAMBDA NULL
#define MAXLENGHT 10000
typedef char labeltype;
typedef struct celltag{
labeltype label;
struct celltag *leftchild;
struct celltag *rightchild;
} celltype;
typedef celltype *node; //ovo ti je cvor
typedef celltype *BinaryTree;
void BiMakeNull(BinaryTree *Tp)
{
*Tp=NULL;
}
int BiEmpty(BinaryTree T)
{
if(T==NULL) return 0;
return 1;
}
void BiCreate(labeltype l, BinaryTree TL, BinaryTree TR, BinaryTree *Tp)
{
(*Tp)=(celltype*)malloc(sizeof(celltype));
(*Tp)->label= l;
(*Tp)->leftchild=TL;
(*Tp)->leftchild=TR;
}
void BiLeftSubtree(BinaryTree T, BinaryTree *TLp)
{
(*TLp)=T->leftchild;
}
void BiRightSubtree(BinaryTree T, BinaryTree *TRp)
{
(*TRp)=T->rightchild;
}
node BiInsertLeftChild(labeltype l, node i, BinaryTree *Tp)
{
if(i==NULL) exit(1);
if(i->leftchild != NULL) exit(2);
i->leftchild->label=l;
i->leftchild->leftchild=NULL;
i->leftchild->rightchild=NULL;
return i->leftchild;
}
node BiInsertRightChild(labeltype l, node i, BinaryTree *Tp)
{
if(i==NULL) exit(1);
if(i->rightchild != NULL) exit(2);
i->rightchild->label=l;
i->rightchild->rightchild=NULL;
i->rightchild->rightchild=NULL;
return i->rightchild;
}
void BiDelete(node i, BinaryTree *Tp)
{
if(i==NULL) exit(3);
if(i->leftchild!=NULL || i->rightchild!= NULL) exit(4);
i=NULL;
}
node BiRoot(BinaryTree T)
{
if(T==NULL) return LAMBDA;
return T;
}
node BiLeftChild(node i, BinaryTree T)
{
if(i==NULL) exit(5);
if(i->leftchild==NULL) return LAMBDA;
return i->leftchild;
}
node BiRightChild(node i, BinaryTree T)
{
if(i==NULL) exit(5);
if(i->rightchild==NULL) return LAMBDA;
return i->rightchild;
}
node nadiRoditelja(node i, node root)
{
if(root->leftchild==i || root->rightchild==i) return root;
if(root->leftchild!=NULL) {nadiRoditelja(i, root->leftchild);}
if(root->rightchild!=NULL) {nadiRoditelja(i, root->rightchild);}
}
node BiParent(node i, BinaryTree T)
{
if(i==NULL) exit(6);
if(i==T) return LAMBDA;
node parent;
parent=nadiRoditelja(i, BiRoot(T));
return parent;
}
labeltype BiLabel(node i, BinaryTree T)
{
if(i==NULL) exit(7);
return i->label;
}
void BiChangeLabel(labeltype l, node i, BinaryTree *Tp)
{
if(i==NULL) exit(8);
i->label=l;
}
//implementacija stoga pomocu polja
typedef struct {
int top;
BinaryTree elementi[MAXLENGHT];
} Stack;
void StMakeNull(Stack *St)
{
St->top=MAXLENGHT;
}
int StEmpty(Stack S)
{
if(S.top>=MAXLENGHT) return 1;
return 0;
}
void StPush(BinaryTree x, Stack *Sp)
{
if(Sp->top==0) exit(101);
else{
Sp->top--;
Sp->elementi[Sp->top]=x;
}
}
void StPop(Stack *Sp)
{
if(StEmpty(*Sp)){exit(212);}
else{
Sp->top++;
}
}
BinaryTree StTop(Stack S)
{
if(StEmpty(S)) {exit(202);}
else{
return (S.elementi[S.top]);
}
}
void Postorder(node i, BinaryTree T)
{
if(i)
{
Postorder(BiLeftChild(i,T), T);
Postorder(BiRightChild(i, T), T);
printf(" %c", BiLabel(i, T));
}
}
void printajdrvo(BinaryTree T, node root)
{
printf(" %c ", BiLabel(root, T));
if(BiLabel(BiLeftChild(root, T), T)== 0) {printf(" NULL ");return;}
else{printf(" %c ", BiLabel(BiLeftChild(root, T), T) );}
if(BiLabel(BiRightChild(root, T), T)== 0) {printf(" NULL\n"); return;}
else{printf(" %c\n", BiLabel(BiRightChild(root, T), T) );}
printajdrvo(T, BiLeftChild(root, T));
printajdrvo(T, BiRightChild(root, T));
}
BinaryTree create(char string[100])
{
Stack niz;
StMakeNull(&niz);
BinaryTree pom, poml, pomr;
BiMakeNull(&pom);
BiMakeNull(&poml);
BiMakeNull(&pomr);
BinaryTree newroot;
int i=0;
while(string[i]!='\0')
{
BiCreate(string[i], poml, pomr, &pom);
if(string[i]>='A' && string[i]<='z')
{
StPush(pom, &niz);
}
else{
BinaryTree l,d;
BiMakeNull(&l);
BiMakeNull(&d);
BiMakeNull(&newroot);
newroot=pom;
d=StTop(niz);
StPop(&niz);
l=StTop(niz);
StPop(&niz);
BiCreate(string[i],l,d,&newroot);
StPush(newroot, &niz);
}
BiMakeNull(&pom);
i++;
}
return newroot;
}
int main()
{
char string[100];
printf("Enter postfix: \n");
scanf(" %s", string);
BinaryTree T;
BiMakeNull(&T);
T = create(string);
printajdrvo(T, BiRoot(T));
Postorder(BiRoot(T), T);
return 0;
}
1条答案
按热度按时间ou6hu8tu1#
printajdrvo永远不会退出,它将永远递归
vs说