Programing/C- programing

트리 : 좌우 child를 가지는 트리 만들기

sosal 2010. 8. 19. 14:48
반응형

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

트리도 딱히 어렵진 않습니다.
다만 링크드리스트 (연결리스트)의 구조가
복잡하게 연결되어있을 뿐 입니다.

우리의 디렉토리 풀더나, 회사 구조도 등이 트리로 구성되어있습니다.
주석을 찬찬히 살펴보면서 소스를 보시면 금방 이해하실 수 있을거라 생각합니다 ㅎㅎ.


#include<iostream>
#include<cstring>

using namespace std;

class node{
private:
    char value[20];
public:
    node(char* name){
        strncpy(value,name,19);  
    }                                // 생성자 함수를 이용해 빠르게 value 정의
    char* getValue(){
        return value;
    }                                // value를 리턴하는 함수
    node* left;
    node* right;
};

 

node* CreateNode(char *value){
    node* newNode = new node(value);
    newNode->left = NULL;
    newNode->right = NULL;

    return newNode;
}      // 단순히 노드를 생성하여 리턴하는 함수

void DeleteNode(node* delNode){
    delete delNode;
}      // 생성된 노드를 삭제하는 함수

void linkNode(node* Parent,node* child){
    if(Parent->left == NULL){
        Parent->left = child;
    }
    else if(Parent->right == NULL){
        Parent->right = child;
    }
    else{
        cout<<"자식을 할당할 수 없습니다."<<endl;
    }
}      // 왼쪽이든 오른쪽이든 빈공간이 있다면 부모로 연결시키는 함수

void PrintNode(node* Node,int depth){
    for(int i=0;i<depth*4;i++)
        cout<<" ";
    cout<<Node->getValue()<<endl;

    if(Node->left != NULL)
        PrintNode(Node->left,depth+1);
    if(Node->right != NULL)
        PrintNode(Node->right,depth+1);
}     // 재귀 방식으로, 모든 child를 출력하는 함수


void DestroyTree(node* parent){
    if(parent->left != NULL)
        DestroyTree(parent->left);
    if(parent->right != NULL)
        DestroyTree(parent->right);

    DeleteNode(parent);
}

int main(){
    node* root = CreateNode("root");
    node* A = CreateNode("document");
    node* B = CreateNode("program");
    linkNode(root,A);
    linkNode(root,B);

    node* C = CreateNode("my picture");
    node* D = CreateNode("my Music");
    linkNode(A,C);
    linkNode(A,D);

    node* E = CreateNode("VS2005");
    node* F = CreateNode("nate_on");
    linkNode(B,E);
    linkNode(B,F);

    node* G = CreateNode("sosal.jpg");
    node* H = CreateNode("monni.mp3");
    node* I = CreateNode("stigmatized.mp3");

    linkNode(C,G);
    linkNode(D,H);
    linkNode(D,I);

    PrintNode(root,0);
    DestroyTree(root);
    return 0;
}

음; 짜다보니.. 뇌자알 트리 소스와 거의 유사하게 되었네요.
뇌자알로 공부하다보니. ㄷㄷ