PS/Algorithm

그래프 알고리즘 - (7) BST의 간단한 구현과 Tree traversal

hyelie 2022. 6. 22. 16:03
이 글은 포스텍 오은진 교수님의 알고리즘(CSED331) 강의를 기반으로 재구성한 것입니다.

 

1. Tree

 앞선 글에서 설명했듯 Tree는 directed acyclic graph이다. 그 중 대표적인 binary search tree의 몇몇 method의 구현과, 그 순회를 살펴볼 것이다.

struct node{
    node *left, *right, *parent;
    int x;
};

// root node 초기화
node* initRoot(){
    node *root = new node;
    root->parent=root;
    root->left = root->right = NULL;
    root->num=rootnum; 
}

void insertNode(node *root, int value){
    node *parent = root;

    // cur node 초기화
    node *cur_node = new node;
    cur_node->x = each_node.first;
    cur_node->left = cur_node->right = NULL;
    
    while(1){
        if(cur_node->x < parent->x){ // parent보다 작으면 왼쪽으로
            if(parent->left == NULL){ // left가 비었으면 left에 값을 넣고 break;
                parent->left = cur_node;
                cur_node->parent = parent;
                break;
            } else{
                parent = parent->left; // 비지 않았으면 그것에서 다시 탐색
            }
        } else if(cur_node->x > parent->x){ // 크면 오른쪽으로
            if(parent->right == NULL){ // right가 비었으면 right에 값을 넣고 break;
               parent->right = cur_node;
               cur_node->parent=parent;
               break;
            } else{
               parent = parent->right; // 비지 않았으면 그것에서 다시 탐색
            }
        }
    }
}

node* search(node *cur_node, int value){
    if(root == NULL) return NULL;
    if(cur_node->x == value) return cur_node;
    else if(cur_node->x > value) return search(cur_node->left, value); // 값이 더 작으면 왼쪽으로 탐색
    else if(cur_node->x < value) return search(cur_node->right, value); // 더 크면 오른쪽으로 탐색
}

 

 

 

2. Tree Traversal

 트리 순회는 3가지 종류가 있다. preorder, inorder, postorder.

 preorder는 parent를 방문한 후 child를 방문하는 것, (parent - left child - right child)
 inorder는 left child - parent - right child 순서로 방문하는 것, 
 postorder는 child를 방문한 후 parent를 방문하는 것(left child - right child - parent)이다.

 DFS로 쉽게 구현 할 수 있고, 크게 어려운 것 없이 구현할 수 있을 것이다.

void preorder(node* cur_node){
    if(cur_node == NULL) return;
    cout<<cur_node->num<<endl;
    result.push_back(cur_node->num);
    preorder(cur_node->left, result);
    preorder(cur_node->right, result);
}

void inorder(node* cur_node){
    if(cur_node == NULL) return;
    inorder(cur_node->left, result);
    cout<<cur_node->num<<endl;
    inorder(cur_node->right, result);
    return;
}

void postorder(node* cur_node){
    if(cur_node == NULL) return;
    postorder(cur_node->left, result);
    postorder(cur_node->right, result);
    cout<<cur_node->num<<endl;
    return;
}
​