2011-05-11 6 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; 
    } 
} 

, 거기이 필요 :

내가 두 그루의 나무가 : AS를

루트 :

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

을 내가 함께 새로운 트리를 만들 필요가 T의 객체와 왼쪽 = 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 *'로 '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

참조로 인한 호출에 관한 제안이 정확합니다. 하지만 내 주요 문제는 다르다 ** 컴파일 오류 ** –

+0

문제는, 당신이 BinarySearchTree 포인터와 함께 인수로 tree_node 구조 포인터를 취하는 그쪽으로 CTOR을 호출하고 싶어한다는 것입니다. 분명히 개인 중첩 클래스이므로 tree_node 구조가 BinarySearchTree 외부에서 볼 수 없도록 코드를 디자인하는 것이 좋습니다. 따라서 CTOR (생성자)를 내 게시물에서 제안한 것으로 변경해야합니다. – Constantinius

0

*를 사용하여 함수 인수를 정의하면 컴파일러는 해당 함수가 포인터를 객체에 기대합니다. 당신은 당신이 메소드를 호출하는 방법을 변경 할 수 있습니다 또는 당신은 당신이와 마찬가지로 참조를 받아들이는 방법 정의를 변경할 수 있습니다

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

: 이렇게하면 당신은 같은 객체 자체가 아니라이 객체의 주소를 제공해야합니다 const T &.

+0

참조로 인한 호출에 관한 제안이 정확합니다. 하지만 내 주요 문제는 ** 컴파일 오류 ** –

1

여기서 달성하고자하는 것을 구현 한 후에는 많은 문제가 발생합니다. 우선 나무에 합류 한 후 루트 노드에 무엇을 저장하고 싶은지가 가장 중요합니다. 많은 경우 결과 트리가 바이너리 검색 트리가되지 않습니다. 포인터의 참조 나 포인터를 트리의 루트 노드 포인터로 전달하여이 컴파일러 문제를 해결할 수 있습니다.

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

예, 당신이 맞습니다 언급 한 다릅니다. 이는 비 BST 2 진 트리를 형성합니다. –

관련 문제