问题描述
我了解插入的“规则”
void printTree(BTNode* node) {
if (node == NULL)
return;
printTree(node->left);
printf("%c",node->item);
printTree(node->right);
}
解决方法
在createExp
中,可以使用左节点已经解析的一些字符来构建右节点。每次左节点解析多个字符时,都会发生这种情况。
为防止这种情况,createExp
应该将信息返回到解析结束的位置。像这样的东西:
char *createExpTree(BTNode** root,char* prefix)
{
if (*prefix) {
if (!isdigit(*prefix)) {
*root = malloc(sizeof(BTNode));
(*root)->item = *prefix;
(*root)->left = NULL;
(*root)->right = NULL;
}
else {
*root = malloc(sizeof(BTNode));
(*root)->item = *prefix;
(*root)->left = NULL;
(*root)->right = NULL;
return prefix;
}
}
prefix = createExpTree(&(*root)->left,++prefix);
return createExpTree(&(*root)->right,++prefix);
}
如果您需要保留createExpTree
签名,则可以将递归展平为这样的循环:
void createExpTree(BTNode** root,char* prefix)
{
BTNode** stack[SIZE];
int stackPosition = 0;
while (*prefix) {
*root = malloc(sizeof(BTNode));
(*root)->left = NULL;
(*root)->right = NULL;
if (isdigit(*prefix)) {
(*root)->item = *prefix++;
if (stackPosition == 0) break;
root = stack[--stackPosition];
}
else {
(*root)->item = *prefix++;
stack[stackPosition++] = &(*root)->right;
root = &(*root)->left;
}
}
}