如何在二叉搜索树中查找元素?

时间:2013-12-26 13:33:58

标签: c++ find

我一直在尝试构建一个2-3节点。添加功能正常工作,到目前为止我已经确认。唯一的问题是find函数,它被调用来查找2-3节点内的元素。它似乎根本不起作用。其中的匹配指针根本不会从find_rec方法获取返回的值,即使我已经分配了它。只要调用函数,它就会得到一个新的给定地址,我不知道为什么会这样做。谁能帮我吗 ?并告诉我我做错了什么?谢谢

**LValue and RValue**

E LValue() {return _first._value;}
E RValue() {return _second._value;}



**find function**

// Assuming this set contains an element y such that (x == y),
// return a reference to y. Such a y must exist; if it does not an
// assertion will fail. 
E& find(E& x) 
{
        // the match pointer is supposed to take
        // returned pointer from the find_rec function
        // Yet, it is not doing that at all.
    E* match = find_rec(x, _root);
    assert(match != nullptr);
    return *match;
}


**find_rec function**

// Helper function: find recursion
// function returns a pointer
E* find_rec(E& x, BNode<E>* root)
{
    if(root == nullptr)
        return nullptr;
    else
    {
        // 2-node
        if(!root->IsThree())
        {
            if(x == root->LValue())
                return &root->LValue();
            else if (x < root->LValue())
                return find_rec(x, root->GetLeft());
            else
                return find_rec(x, root->GetRight());
        }
        // 3-node
        else
        {
            if(x == root->LValue())
                return &root->LValue();
            else if(x == root->RValue())
                return &root->RValue();
            else if(x < root->LValue())
                return find_rec(x, root->GetLeft());
            else if(x < root->RValue())
                return find_rec(x, root->GetMiddle());
            else
                return find_rec(x, root->GetRight());
        }
    }
}

2 个答案:

答案 0 :(得分:1)

从代码中可以看出,您正在返回本地临时地址。

我无法确定,因为LValue()方法声明不可见,但如果它按值返回节点内容而不是引用,则find_rec函数将返回垃圾(地址为临时分配在堆栈上。)

顺便说一句,体面的编译器应该为此发出警告。

答案 1 :(得分:1)

当树中不存在所需的值时,代码显然能够返回nullptr。

当它进入那种情况时,断言将触发并且*match返回将失败。我希望您需要更改函数签名以提供允许这种情况的返回类型。