【问题标题】:c recursive binaryc递归二进制
【发布时间】:2021-02-02 21:33:40
【问题描述】:

我了解插入的“规则”

void printTree(BTNode* node) {
    
    if (node == NULL)
        return;
    printTree(node->left);
    printf("%c", node->item);
    printTree(node->right);

}

【问题讨论】:

  • createExpTree 的签名错误。要解析前缀表达式,您需要在开始解析右操作数之前知道左操作数结束的位置。您的函数不会报告光标的最终位置。

标签: c algorithm binary-tree prefix-tree


【解决方案1】:

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

【讨论】:

  • 谢谢你。但是签名不应该改变,因此很遗憾我不能按照你的风格去做。您有什么建议可以在不更改签名的情况下执行此操作吗?
  • 您可以将prefix 变量设为全局变量,并将第二个虚拟参数传递给createExpTree 函数以保持相同的签名。但是很多人,包括我,都将其视为一个肮脏的解决方案......
  • 解决办法大概就是把递归压扁成一个循环。
  • 你有什么提示吗?我切换到递归,因为我不能迭代地做。我将 Stack Struct 添加到我可以用来帮助我构建树的原始帖子中
  • 幸运的是你有一个数字限制(200),所以你可能不需要结构来使用堆栈,一个简单的数组可能就足够了。
猜你喜欢
  • 2021-04-28
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-02
  • 2017-01-26
  • 2016-05-03
  • 2014-12-05
相关资源
最近更新 更多