2017-05-30 71 views
0

以下代码运行一秒钟,然后运行时错误由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; 
} 
+0

'data + 1' and'data +(int)pow(2,level - 1)'你确定你做得对吗? – roottraveller

+0

用于在我的字符串中查找适当的字符,它依赖于我放置字符的顺序。 –

回答

0

即使你保留至少POW(2级)字符由*数据引用的字符串中的下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 

例如,水平= 4,由data = 16指向的字符串的大小,当沿着TreeChild()调用treeChild时,将导致: data + 4 + pow(2,3)+ pow(2,2)+ pow(2 ,1) - > data + 18(!!)

+0

你是正确的,我的目标是创建一个树 一个儿童: B C, B带小孩: d E和C有: “ABDECFG” F G 给出的字符串自上而下左右。 运行TreeCreate(3,字符串)导致调用堆栈错误,我现在认为这是我的代码通过了它拥有的字符数量的结果。 –

+0

嗯 - 你说'call stack error'是什么意思? –

+0

错误是由我的malloc引起的,我需要的是sizeof(Node)而不是sizeof(node)。至于数据,四级二叉树将有15个字符,我的if语句应该是(level> 1)而不是(level!= 0),以便它不会通过第15个字符。现在所有人都在工作,感谢您的帮助。 –