2012-10-16 2 views
0

C++로 트리를 만들고 싶습니다. 오류 또는 경고없이 코드를 컴파일 할 수는 있지만 출력이 표시되지 않습니다.postfix 표현식에서 표현식 트리를 만드는 방법은 무엇입니까?

오류가 inorder fn에 있다고 생각하지만 이것을 제거하는 방법을 모르겠습니다.

#include<iostream.h> 
#include<conio.h> 
#include<stdlib.h> 

struct tree 
{ 
    int data; 
    struct tree * left; 
    struct tree * right; 
}; 
typedef struct tree * TREE; 

TREE maketree(int x) 
{ 
    TREE tree = (TREE)malloc(sizeof(tree)); 
    if(tree == NULL) 
    { 
     return NULL; 
    } 
    tree->left = tree->right = NULL; 
    tree->data = x; 
return tree; 
} 

void setleft(TREE tree,int x) 
{ 
    if(tree == NULL || tree->left != NULL) 
    { 
     cout<<"\t Error !! Inserting New Node At Left Side !\n"; 
    } 
    else 
    { 
     tree->left = maketree(x); 
    } 
} 

void setright(TREE tree,int x) 
{ 
    if(tree == NULL || tree->right != NULL) 
    { 
     cout<<"\t Error !! Inserting New Node At Right Side !\n"; 
    } 
    else 
    { 
     tree->right = maketree(x); 
    } 
} 

void inorder(TREE root) 
{ 
    if(root != NULL) 
    { 
     TREE left=root->left; 
     TREE right=root->right; 
     inorder(left); 
     cout<<root->data; 
     inorder(right); 
    } 
} 

void main() 
{ 
clrscr(); 
    TREE root = NULL,child,parent; 
    int i,j = 1; 
    cout<<"Root Of Binary Search Tree :- "; 
    cin>>i; 
    root = maketree(i); 
    cout<<"\n\n"; 
    while(i) 
    { 
     cout<<j<<" Node Value:- "; 
     cin>>i; 
     if(i < 0) 
     { 
      break; 
     } 
     parent = child = root; 
     while((i != parent->data) && (child != NULL)) 
     { 
      parent = child; 
      if(i < parent->data) 
      { 
       child = parent->left; 
      } 
      else 
      { 
       child = parent->right; 
      } 
     } 
     if(i == parent->data) 
     { 
      cout<<"\t Value "<<i<<" Already Present In BST !!\n"; 
     } 
     else if(i < parent->data) 
     { 
      setleft(parent,i); 
     } 
     else 
     { 
      setright(parent,i); 
     } 
     j++; 
    } 
    inorder(root); 
getch(); 
} 
+0

일부 예제 입력의 경우 예상 출력은 무엇이고 실제 출력은 무엇입니까? 질문을 수정하여 포함 시키십시오. –

+0

을 보자 마자 대신에 을 포함 시켰습니다. 귀하의 메인이 int가 아닌 void를 반환 할 것이라는 것을 알았습니다. 그리고 C++의 유일한 최악의 기능으로 C로 작성하지 마십시오. – CashCow

답변

3

C++로 작성하려면 C++로 작성하십시오. 생성자와 소멸자 및 클래스 메서드를 사용하십시오. 가능하면 데이터 회원을 비공개로 설정하십시오. malloc 대신 new을 사용하면 소멸자가 트리의 자식 노드를 삭제하려고합니다.

당신이 작성한 것은 C++과 iostream의 최악의 기능과 기존의 비표준 비표준 버전을 통합 한 것 이외의 C 언어로 작성되었습니다.

이것은 약간의 운동처럼 보입니다.

어디에도 freemalloc으로 할당 한 데이터가 표시되지 않습니다.

정렬 논리는 기본이 아닌 트리 기반 함수 여야합니다.

"오류"출력에 공백이 없지만 잘 모르겠습니다.

tree을 데이터 유형 (구조체, struct에서 정규화 할 필요가없는 구조체) 및 변수 (자주 사용되는 구조체)로 사용하는 것은 합법적이지만 좋지 않습니다.

자, 이제 약간의 코드입니다. 대부분 당신의 것을 기반으로합니다.

class tree 
{ 
    tree * left; 
    tree * right; 
    int value; 

public: 
    explicit tree(int v); 
    ~tree(); 

    bool insert(int v); 
    void print(std::ostream&) const; 

private: 
    tree(const tree&); 
    tree& operator=(const tree&); 

}; 

tree::tree(int v) : 
    left(NULL), 
    right(NULL), 
    value(v) 
{ 
} 

tree::~tree() 
{ 
    delete right; 
    delete left; 
} 

bool tree::insert(int v) 
{ 
    // inserts v in the correct place in the tree, returns true 
    // if it inserted or false if it already exists 

    // I want you to fill in the detail for this function 
} 

void tree::print(std::ostream& os) const 
{ 
    // prints the tree 
    if(left) 
    { 
     left->print(os); 
    } 
    os << value << '\n'; 
    if(right) 
    { 
     right->print(os); 
    } 
} 

여기에 구현할 함수가 하나 있습니다. 개인용 복사 생성자 또는 할당 연산자를 구현할 필요가 없습니다.

main()도 구현하십시오. 힙에있는 메인에 트리를 구현할 필요가 없다는 점에주의하십시오. 그것을 스택에 구현하십시오.

main()은 숫자를 읽고 insert() 메서드를 호출 한 트리에 삽입 한 다음 끝에 std::cout을 매개 변수로 전달하여 트리를 인쇄합니다.

#include <iostream> (iostream.h가 아님)이 필요하며 작동합니다.

+0

오 마마 테오 타갈로그어 푸시 데 자네 코드 및 불타. . . 오우. . . –

+0

적절한 이진 트리 구현을 위해 삽입이 너무 편해지면 삽입의 균형을 다시 조정해야합니다. 이는 실제로 헤드 노드가 변경 될 가능성이 있음을 의미합니다. 이렇게하는 것은 아마도 지금까지는 운동 범위를 벗어나는 것일 수 있습니다. 머리가되도록 할당 된 노드는 동일한 "개체"로 남아있을 수 있지만 그 값은 이동합니다. 트리 항목을 복사하는 데 비용이 많이 들고 (스왑/이동) 실제로 헤드 노드로 간주되는 "개체"를 변경해야합니다. – CashCow

관련 문제