【问题标题】:creating a new tree from the existing trees as left and right从现有的树为左和右创建一棵新树
【发布时间】:2011-05-11 17:45:01
【问题描述】:

我的代码与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;

我需要创建一个新树:

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

为此,我尝试添加此构造函数:

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

并尝试从 main 调用:

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

我知道这行不通,但我该怎么办?

编译错误

错误 C2664: 'BinarySearchTree::BinarySearchTree(const T &,BinarySearchTree::tree_node *,BinarySearchTree::tree_node *)' : 无法将参数 2 从 'BinarySearchTree *' 转换为 'BinarySearchTree::tree_node *'

【问题讨论】:

    标签: c++ data-structures binary-tree


    【解决方案1】:

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

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

    我建议,实现一个所谓的复制构造函数,一个构造函数,将同一类的实例作为参数:

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

    这可以让您从子节点创建一棵新树。

    希望我已经回答了你的问题,如果有什么不明白的地方欢迎追问! :)

    【讨论】:

    • 您关于引用调用的建议是正确的。但我的主要问题与 Compile Error 中提到的不同
    • 问题是,你想调用一个 CTOR,它将一个 tree_node 结构指针作为参数,并带有一个 BinarySearchTree 指针。我建议你设计你的代码,从 BinarySearchTree 外部看不到 tree_node 结构,因为它显然是一个私有嵌套类。因此,您必须将您的 CTOR(构造函数)更改为我在帖子中建议的内容。
    【解决方案2】:

    在实现您在此处尝试实现的目标后,您会发现许多问题。首先,在加入树之后,您想要在根节点存储什么是最重要的,在许多情况下,结果树不会是二叉搜索树。你可以通过传递对指针的引用或指向树根节点指针的指针来解决这个编译器问题。

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

    【讨论】:

      【解决方案3】:

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

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

      您可以更改调用方法的方式,也可以更改方法定义以接受引用,就像使用 const T& 一样。

      【讨论】:

      • 您关于引用调用的建议是正确的。但我的主要问题与 Compile Error 中提到的不同
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多