BinaryTree插入

时间:2014-12-15 14:20:48

标签: c++ binary-search-tree

所以我已经为我的Tree中的Value提供了这个Insert函数如何将它转换为这种类型的void函数?

void InsertValue(Node* root, int value){

这是我的正常功能:

Node* Insert(Node* root,int value) {
    if(root == NULL) { // empty tree
        root = CreateNode(value);
    }
    // if data to be inserted is lesser, insert in left subtree.
    else if(value <= root->value) {
        root->left = Insert(root->left,value);
    }
    // else, insert in right subtree.
    else {
        root->right = Insert(root->right,value);
    }
    return root;
}

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

你可以做以下两件事之一:

  1. 使root指向指针。这可以很好地工作,但语法可能有点尴尬,要求您在使用前取消引用root
  2. 使用对指针的引用。参考文献为您提供了&#34; power&#34;上面提到的双指针没有任何笨拙的语法,而且很容易做到。
  3. 所以选项#2就是。怎么做?只需将其功能更改为接受root作为指针的引用。

    void InsertNode(Node*& root, int value)
    {
        // your existing code!
    }
    

答案 1 :(得分:1)

如果没有返回值保留传递回调用者的可能添加的新节点,则必须以某种方式返回潜在的插入节点 。如果需要void结果类型,则需要按地址(Node **)或引用(Node *&)传递目标指针。鉴于这是标记的C ++,我使用后者。

void Insert(Node*& root, int value) 
{
    if(root == NULL)
        root = CreateNode(value);

    else if(value <= root->value)
        Insert(root->left,value);

    else
        Insert(root->right,value);
}

请注意,这始终会在节点的 left 侧挂起重复项。要在右侧挂起重复项,请更改此项:

    else if(value <= root->value)
        Insert(root->left,value);

到此:

    else if(value < root->value)
        Insert(root->left,value);

最后,如果您想在树中使用唯一键(即忽略重复项),则以下操作会执行此操作:

void Insert(Node*& root, int value) 
{
    if(root == NULL)
        root = CreateNode(value);

    else if (value < root->value)
        Insert(root->left,value);

    else if (root->value < value)
        Insert(root->right, value);

    // else key is already present; do nothing.
}

这假设一个strict weak ordering个键值,它具有以下属性:

if (!(a<b || b<a))
    then  a == b

祝你好运。