2014-08-27 90 views
0

我试图实现bintree,但我在插入方法有问题。 如果我添加第一个元素,程序不会崩溃,但是当我引入2个或更多元素时,程序崩溃。分割故障bintree

这是代码

template <typename T> 
void Arbol<T>:: insertar(T c){ 
    if(laraiz==0) 
    { 
     laraiz=new celdaArbol; 
     laraiz->elemento=c; 
     laraiz->padre=laraiz->hizqu=laraiz->hder=0; 
    } 
    else { 
     celdaArbol *com=laraiz; 
     bool poner=false; 
     while(poner==false){ 
      if(c>com->elemento){ 
       if(com->hder==0){ 
        com->hder= new celdaArbol; 
        com->hder->elemento=c; 
        com->hder->padre=com; 
        poner=true; 
       } 
       else{ 
        com=com->hder; 
       } 
      } 
      else { 
       if(com->hizqu==0){ 
        com->hizqu= new celdaArbol; 
        com->hizqu->elemento=c; 
        com->hizqu->padre=com; 
        poner=true; 
       } 
       else { 
        com=com->hizqu; 
       } 
      } 
     } 
    } 
} 

我认为这个问题是在else:

else{ 
    com=com->hizqu; //com=com->hder; 
} 

因为我在节目中的部分输入几次不应该的调试器看到做。

+0

我认为这将是非常有益的多用英语变量,不管你讲不同的语言键入的名字......这样一来有效地阻止你的人谁不说你的语言(西班牙语?)甚至可以查看代码。阅读c + +是非常困难的,如果这种困难被不同的语言所接受,它可以是非常......你知道...... – fritzone 2014-08-27 18:51:54

+0

为什么所有其他的?使用退货并继续使代码更清洁。 – scohe001 2014-08-27 18:56:49

+0

谢谢你fritzone。将来我会用英语写一切。 – dasavi 2014-08-28 09:27:36

回答

1

根据此代码:

laraiz->padre=laraiz->hizqu=laraiz->hder=0; 

不好好intialize指针hizquhdernullptrceldaArbol类的构造函数。而且你不要在if(c>com->elemento){的任何一个分支中初始化它们,所以它们似乎有垃圾值。

此外,如果你使用正确的C++构造你的代码可以变得更易读且不易出错:

celdaArbol *com=laraiz; 
    while(true){ 
     celdaArbol *&ptr = c > com->elemento ? com->hder : com->hizqu; 
     if(ptr ) { 
      com = ptr; 
      continue; 
     } 
     ptr = new celdaArbol; 
     ptr->elemento=c; 
     ptr->padre=com; 
     ptr->hder = ptr->hizqu = nullptr; 
     break; 
    } 

这个代码在逻辑上等于你的,只是它更短,更易于阅读,避免重复建设和修复您的错误。

+0

我有这个代码的问题,当我尝试阅读ptr在他父亲的元素,如果我插入5,6,15 15的父亲是5不是6 如果我使用debbuger,程序永远不会输入if (ptr){com = ptr; 继续; } 我不知道为什么,因为如果com-> hder是6,ptr不是nullptr – dasavi 2014-08-28 11:15:15

+0

我用我的代码与nullptr,它工作正常。 – dasavi 2014-08-28 16:54:14

+0

@dasavi我无法为您调试您的代码,我甚至无法帮助您,因为我没有看到您的修改代码。您可能会错误地复制它或其他内容。 – Slava 2014-08-28 17:01:27

0

对于每个叶子节点(树的根除外),您从不初始化左侧子节点或右侧子节点,只是未指定的值。

您可能打算将它们初始化为nullptr

这里有一个例子:

if (com->hizqu==0){ 
    com->hizqu = new celdaArbol; 
    com->hizqu->elemento = c; 
    com->hizqu->padre = com; 
    poner = true; 

    // What is the value of com->hizqu->hizqu? 
    // What is the value of com->hizqu->hder? 
}