重载operator +以在BinaryTree中插入节点

时间:2016-04-20 07:03:07

标签: c++ operator-overloading binary-search-tree

这些是我的二叉树类:

class Node
{
    friend class BinaryTree;
    int value;
    Node *left, *right;
};

class BinaryTree
{
private :
    Node *first ;
public :
    void insert_node(int x);
    void delete_node(int x);
    void in_order_traversal();
    void print_leafs (Node *first);
    void print_leafs2 ();
    int get_height();
    BinaryTree();
    ~BinaryTree();

    // operator oveloading
};

我想重载+运算符,所以我可以在树中插入一个新元素,序列应该是这样的:

int x;
BinaryTree *bt;
x + bt; // or bt + x;

我已经有了一个向树插入节点的方法,我所要做的就是在重载操作符+代码中调用该方法。这就是我尝试这样做的方式:

//inline declaration
friend BinaryTree& operator + ( BinaryTree& bt, const int x)
{
    bt.insert_node(x);
    return bt;
}

我不知道为什么,但是当我调试这段代码时,行

bt + x;

被编译器忽略。

任何帮助将不胜感激:)

1 个答案:

答案 0 :(得分:2)

由于x被声明为int并且bt被声明为指针,因此使用x + bt;bt + x;计算指针并且值为丢弃。

为了调用函数friend BinaryTree& operator + ( BinaryTree& bt, const int x),运算符的LHS必须是BinaryTree类型的对象,而不是指向BinaryTree的指针。

您需要使用:

*bt + x;

这只是句法部分。从语义上讲,该运算符重载函数似乎不正确。

使用时

int a  = 10;
a + 20;

a的值未更改。最后一行简单地计算为30,并且该值被丢弃。

如果您使用

int b = a + 20;

b被赋予30的值,但a保持不变。您可能希望为运算符重载函数创建类似的语义。

BinaryTree bt1;             // Create an empty tree.
BinaryTree bt2  = bt1 + 1;  // bt2 contains everything in bt1 + 1.

在这种情况下,请将功能更改为:

friend BinaryTree operator + ( BinaryTree const& bt, int x)
//               |                       |           ^^^ No need for const
//               |                       ^^^^^^^^ Change it to const&
//              ^^^ Change the return type to be an object, not a reference.    
{
   BinaryTree ret(bt);  // Provide a proper copy constructor
   ret.insert_node(x);
   return ret;
}