【问题标题】:Call stack error when creating binary tree with recursion使用递归创建二叉树时调用堆栈错误
【发布时间】:2017-10-30 10:11:28
【问题描述】:

下面的代码运行一秒后出现运行时错误是由node->data = *data;

 Node *TreeCreate(int level, const char *data)
{
    Node *node = malloc(sizeof(node));

    if (node != NULL) {
    node->data = *data;
    }

    if (level != 0) {
        node->leftChild = TreeCreate(level - 1, data + 1);
        node->rightChild = TreeCreate(level - 1, data + (int)pow(2, level - 1));
    }
    return node;
}

【问题讨论】:

  • data + 1data + (int)pow(2, level - 1) 你确定你做对了吗?
  • 用于在我的字符串中找到合适的字符,它取决于我放置字符的顺序。

标签: c stack runtime call


【解决方案1】:

即使您为 *data 引用的字符串至少保留了 pow(2, level) 字符,下一次 TreeCreate() 调用也只是超出了这些边界:

TreeCreate(level, data) //--> 
    TreeCreate(level, data + 1) //--> ...
    TreeCreate(level, data + pow(2, level-1) // -->
           TreeCreate(level, data + pow(2, level-1) + 1) //-->  well still may fit to you string
           TreeCreate(level, data + pow(2, level-1) + pow(2, level-2) // --> may not fit 

例如,level = 4,data 指向的字符串的大小 = 16,当遍历 leftChild 的 TreeCreate() 调用树时,将导致: 数据 + 4 + pow(2, 3) + pow(2, 2) + pow(2, 1) --> 数据 + 18 (!!)

【讨论】:

  • 你是对的,我的目标是创建一棵树 A 孩子:B C,B 有孩子:D E 和 C 与:F G 给定字符串“ABDECFG”。从上到下从左到右。运行 TreeCreate(3, the string) 会导致调用堆栈错误,我现在认为这是我的代码传递了它拥有的字符数的结果。
  • 这个错误是由我的malloc引起的,我需要是sizeof(节点)而不是sizeof(节点)。至于数据,四级二叉树将有 15 个字符,我的 if 语句应该是 (levels > 1) 而不是 (levels != 0),这样它就不会通过第 15 个字符。现在一切正常,感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
  • 2013-04-21
  • 2013-04-21
  • 2019-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多