Programing/C- programing

이진탐색트리 자동 생성 소스

sosal 2010. 8. 23. 23:12
반응형

/*
 http://sosal.tistory.com/
 * made by so_Sal
 */

루트 노드를 50으로 넣은 후, rand()%100 으로 노드를 계속해서 생성해나갑니다.
생성된 노드보다 큰값이면 우, 작으면 좌측 노드로 향하며
우측, 또는 좌측노드가 NULL이라면 새로 생성된 노드는
자식노드가 되며, NULL이 아닐 경우에는, 다시 크기 비교를 반복합니다.

#include<iostream>
#include<time.h>
using namespace std;


class node{
private:
    int value;
public:
    node(int val){
        value=val;
    }
    int getValue(){
        return value;
    }
    node* left;
    node* right;
    ~node(){
        delete this;
    }
};

node* CreateNode(int value);      // 노드생성함수
void InsertNode(node* tree,node* newNode);
void DeleteNode(node* delNode);   // 노드삭제함수
void DestroyTree(node* root);        // 트리 삭제함수
void PrintTree(node* Node);          // 노드 출력함수 (전위식)

int main(){
    srand(time(0));

    node* root = CreateNode(50);    // root 노드를 생성한 후
   
    node* newNode;
    for(int i=0;i<100;i++){
        newNode = CreateNode(rand()%100);
        InsertNode(root,newNode);
    }
   
    PrintTree(root);
   
    return 0;
}

node* CreateNode(char value){
    node* newNode = new node(value);   // 생성 후
    newNode->left = NULL;                     // 각 value 초기화
    newNode->right = NULL;

    return newNode;
}

void InsertNode(node* tree,node* newNode){
    if(tree->getValue() < newNode->getValue()){  
        if(tree->right == NULL)       //현재 노드보다 newNode가 큰값이면 우, 작으면 좌
            tree->right = newNode;   //<--우 또는 좌가 비어있으면 바로 자식노드로!
        else
            InsertNode(tree->right,newNode); //아니면 다시 비교
    }
    else if(tree->getValue() > newNode->getValue()){
        if(tree->left == NULL)
            tree->left = newNode;   //위 if절과 방향만 반대
        else
            InsertNode(tree->left,newNode);
    }

    return;
}


void PrintTree(node* Node){
    if(Node == NULL)
        return;
    PrintTree(Node->left);                  
    cout<<Node->getValue()<<endl;   // 중위식 출력
    PrintTree(Node->right);                // 재귀
    return;
}

void DeleteNode(node* delNode){
    delete delNode;
    return;
}

void DestroyTree(node* root){
    DestroyTree(root->left);
    DestroyTree(root->right);
    DeleteNode(root);
    return;
}