2011-05-11 99 views
2

我的代码与this thread中给出的代码类似。从左侧和右侧创建现有树木的新树

template<class T> 
class BinarySearchTree 
{ 
private: 
    struct tree_node 
    { 
     tree_node* left; 
     tree_node* right; 
     T data; 

     tree_node(const T & thedata, tree_node * l = NULL, tree_node * r = NULL) 
       : data(thedata), left(l), right(r) { } 
    }; 
    tree_node* root; 

public: 
    BinarySearchTree() 
    { 
     root = NULL; 
    } 
} 

在我的主要程序,有需要的:

我有两棵树:

BinarySearchTree<T> tree1; 
BinarySearchTree<T> tree2; 

我需要创建一个新的树:

根作为T的对象,left = tree1,right = tree2;

要做到这一点,我试图添加此构造函数:

BinarySearchTree(const T& x, tree_node* l, tree_node* r); 

,并试图从主拨打:

BinarySearchTree<T> newTree(T object,tree1,tree2); 

我明白这是不行的,但我应该怎么办?

编译错误

错误C2664: 'BinarySearchTree :: BinarySearchTree(常量Ť&,BinarySearchTree :: tree_node *,BinarySearchTree :: tree_node *)':不能转换参数2从 'BinarySearchTree *' 来“BinarySearchTree :: tree_node *”

回答

1

首先:你的构造函数呼叫是不正确的,应该是这样的:

BinarySearchTree<T> newTree(object,tree1,tree2); 

我建议,实行所谓的拷贝构造函数,构造,采取同样的类的实例作为论据:

BinarySearchTree(const BinarySearchTree& other) 
{ 
    root = other.root; // propably you have to allocate it with "new" 
} 

,这将让你从一个子节点创建新树。

我希望我已经回答了你的问题,随时询问是否有什么不够清楚! :)

+0

关于按参考电话的建议是正确的。但我的主要问题是不同的,如**编译错误** – 2011-05-12 00:44:39

+0

中提到的问题是,你想调用CTOR,它将tree_node结构指针作为参数与BinarySearchTree指针。 我建议你设计你的代码,Tree_node结构在BinarySearchTree之外是不可见的,因为它显然是一个私有的嵌套类。所以你必须改变你的CTOR(构造函数)到我在文章中提到的东西。 – Constantinius 2011-05-12 07:42:54

0

如果你定义你的函数参数用*表示编译器,他们期望一个指向对象的指针。如果你这样做,你必须给对象的地址,而不是像对象本身:

BinarySearchTree<T> newTree(object,&tree1, &tree2); 

你可以改变你如何调用该方法也可以更改方法定义如同你接受一个参考const T &。

+0

关于通过参考来电的建议是正确的。但我的主要问题是不同的,如**编译错误** – 2011-05-12 00:44:57

1

在实现您尝试在此处实现的内容后,您会遇到许多问题。首先,按照您想要的方式加入树后,您在根节点上存储的内容是最重要的,并且在很多情况下,生成的树不会是二叉搜索树。只需将对指针或指针的引用传递给树的根节点指针,就可以解决此编译器问题。

void Join(const T & thedata, tree_node *& l, tree_node &* r); 
+0

是的,你是正确的。它会形成一个非BST二叉树。 – 2011-05-29 05:23:47