2012-04-18 110 views
3

也许之前要求百万次,但我根本不明白这是什么问题。我不想在互联网上使用任何代码,所以我只是试图对我的想法进行编程。这个或我的打印功能都是错误的。下面的代码有什么问题吗?二进制搜索树插入C++

void addNode(int value) 
    { 
     Node* newNode=new Node; 
     newNode->data=value; 
     if(root==NULL) 
      root=newNode; 
     else { 
      Node* temp=root,*parent; 
      while(temp!=NULL) 
      { 
       parent=temp; 
       if(temp->data == value) 
        return; 
       else if(temp->data < value) 
        temp=temp->left; 
       else 
        temp=temp->right; 
      } 
      temp=newNode; 
     } 
    } 
+0

您从不指定任何节点的“left”或“right”成员。 – 2012-04-18 18:21:45

+0

我正在使用'temp = temp-> left'和'temp = temp-> right'。这不算什么? – Ali 2012-04-18 18:22:36

+0

@rolandbishop:不;这会将您的本地变量更改为引用不同的节点,但是一旦找到插入点,您就不会修改树。 – 2012-04-18 18:25:52

回答

6
temp=newNode; 

这将指针分配给本地变量,当函数返回时,失去了新的节点,其被丢弃。相反,您想将其分配给树中的指针;也许是这样的:

if (temp->data < value) {  // If the new node should be to the left 
    if (temp->left) {   // If there is a left subtree 
     temp = temp->left;  //  Move into the left subtree 
    } else {      // Otherwise 
     temp->left = newNode; //  Insert the new node there 
     return;     //  Done. 
    } 
} 

,同样也temp->right如果value < temp->data

另外:

if (temp->data == value) 
    return; 

你有内存泄漏存在;返回前您应该delete newNode

+0

我认为他也错过了插入树中间的情况。 – 2012-04-18 18:25:27

+0

谢谢你的答案。我想我有点困惑,所以这可能会变得愚蠢,但我没有完全理解你检查temp-> left的原因,如'if(temp-> left'。不是while循环已经规定,如果为NULL值,我的意思是为什么你必须用if语句来检查它? – Ali 2012-04-18 18:27:15

+0

@JohnKalberer:平衡树是一种优化;更好的是让基础知识工作得更好 – 2012-04-18 18:28:02