c递归二进制

c递归二进制,c,algorithm,binary-tree,prefix-tree,C,Algorithm,Binary Tree,Prefix Tree,我理解插入的“规则” void printTree(BTNode* node) { if (node == NULL) return; printTree(node->left); printf("%c", node->item); printTree(node->right); } 在createExp中,右节点可能是使用左节点已经解析的一些字符构建的。每次左节点解析多个字符时都会发生这种情况

我理解插入的“规则”

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;
        }
    }
}

createExpTree的签名错误。要解析前缀表达式,在开始解析右操作数之前,需要知道左操作数的结束位置。您的函数不会报告光标的最终位置。谢谢。然而,签名不应更改,因此我不能做你的风格很遗憾。您有什么建议可以在不更改签名的情况下执行此操作吗?您可以将
前缀
变量设置为全局变量,并将第二个伪参数传递给
createExpTree
函数以保留相同的签名。但很多人,包括我在内,都会认为这是一个肮脏的解决方案……解决方案可能是将递归性展平成一个循环。你有什么提示给我吗?我切换到递归,因为我不能迭代地执行它。我在原始文章中添加了Stack Struct,我可以用它来帮助我构建树。如果你有数字限制(200),那么你可能不需要Struct来使用堆栈,一个简单的数组就足够了。