создание нового дерева из существующих деревьев как слева, так и справа - PullRequest
2 голосов
/ 11 мая 2011

Мой код похож на тот, который указан в этой теме .

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 (const T &, BinarySearchTree :: tree_node *, BinarySearchTree :: tree_node *)': невозможно преобразовать параметр 2 из 'BinarySearchTree* 'to' BinarySearchTree :: tree_node * '

Ответы [ 3 ]

1 голос
/ 26 мая 2011

Есть много проблем, с которыми вы столкнетесь после реализации того, что вы пытаетесь достичь здесь. Прежде всего, после объединения деревьев наиболее важным является то, как вы хотите хранить то, что храните в корневом узле, и во многих случаях результирующее дерево не будет двоичным деревом поиска. Вы можете решить эту проблему компилятора, просто передав ссылку на указатель или указатель на указатель корневого узла деревьев.

void Join(const T & thedata, tree_node *& l, tree_node &* r );
1 голос
/ 11 мая 2011

Прежде всего: ваш вызов конструктора неверен, он должен быть таким:

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

Я бы предложил реализовать так называемый конструктор копирования, конструктор, использующий экземпляр того же класса, что и аргумент:

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

это позволит вам создать новое дерево из дочернего узла.

Надеюсь, я ответил на ваш вопрос, не стесняйтесь спрашивать, если что-то недостаточно ясно! :)

0 голосов
/ 11 мая 2011

Если вы определяете аргументы вашей функции с помощью *, это говорит о том, что компилятор ожидает указатель на объект. Если вы сделаете это, вы должны указать адрес объекта, а не сам объект, например:

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

Вы можете либо изменить способ вызова метода, либо изменить определение метода, чтобы принимать ссылку, как вы это делаете с const T &.

...