我了解插入的“规则”
void printTree(BTNode* node) {
if (node == NULL)
return;
printTree(node->left);
printf("%c", node->item);
printTree(node->right);
}
我了解插入的“规则”
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;
}
}
}