【问题标题】:Binary Search Tree Insertion C++二叉搜索树插入 C++
【发布时间】:2012-04-18 18:15:40
【问题描述】:

之前可能被问过数百万次,但我根本无法理解这有什么问题。我不想在互联网上使用任何代码,所以我只是尝试对我的想法进行编程。这个或我的打印功能是错误的。下面的代码有什么问题吗?

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

【问题讨论】:

  • 您永远不会分配任何节点的leftright 成员。
  • 我正在使用“temp=temp->left”和“temp=temp->right”。这不算数吗?
  • @rolandbishop:不;这会更改您的局部变量以引用不同的节点,但是一旦找到插入点,您就不会修改树。

标签: c++ algorithm binary-search-tree


【解决方案1】:
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.
    }
}

如果value &lt; temp-&gt;datatemp-&gt;right 也是如此。

还有:

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

那里有内存泄漏;你应该在返回之前delete newNode

【讨论】:

  • 我认为他也错过了您插入树中间的情况。
  • 感谢您的回答。我想我有点困惑,所以这可能很愚蠢,但我没有完全理解您将 temp->left 检查为 'if(temp->left' 的原因. while 循环不是已经提供了 NULL 值的情况吗?我的意思是为什么你必须用 if 语句检查它?
  • @JohnKalberer:平衡树是一种优化;最好先让基础知识发挥作用。
  • @rolandbishop:一旦找到空指针,主循环就会停止;但是您需要重新分配该指针以指向新节点才能将其添加到树中。使用我的更改,您将不需要在外循环上进行测试;找到插入点后,您将返回。
  • 这个方法会被包含在同一个while循环中吗?比如'while(temp!=NULL)'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多