별의 공부 블로그 🧑🏻‍💻
728x90
728x170

조직 구조도 만들기 (이진 트리 이용)

서론

트리(Tree) 자료구조를 이용하여 조직 구조도를 만들어보자.

이진 트리(Binary Tree)를 이용하고, 1명의 상사 직원 밑에 2명의 부하 직원을 둘 수 있다고 가정한다.

상사 직원이 없을 경우, 부하 직원을 추가할 수 없다.

조직 구조도 예

 

코드

#include <iostream>
#include <queue>

struct node {
    std::string position;
    node* first;
    node* second;
};

struct org_tree {
    node* root;

    static org_tree create_org_structure(const std::string& pos) {
        org_tree tree;
        tree.root = new node {pos, NULL, NULL};
        return tree;
    }

    static node* find(node* root, const std::string& value) {
        if (root == NULL) {
            return NULL;
        }

        if (root->position == value) {
            return root;
        }

        // 왼쪽 서브 트리 검사
        auto firstFound = org_tree::find(root->first, value);   

        if (firstFound != NULL) {
            return firstFound;
        }

        // 오른쪽 서브 트리 검사
        return org_tree::find(root->second, value);   
    }

    bool addSubordinate(const std::string& manager, const std::string& subordinate) {
        auto managerNode = org_tree::find(root, manager);

        //// 1. 부하 직원 추가 실패
        // 상사 직원이 없을 경우
        if (!managerNode) {
            std::cout << manager << "을(를) 찾을 수 없습니다: " << std::endl;
            return false;
        }

        // 상사 직원 밑에 이미 2명의 부하 직원이 있을 경우
        if (managerNode->first && managerNode->second) {
            std::cout << manager << " 아래에 " << subordinate << "을(를) 추가할 수 없습니다." << std::endl;
            return false;
        }

        //// 2. 부하 직원 추가 성공
        // 상사 직원 밑에 부하 직원이 없을 경우
        if (!managerNode->first) {    // (1) 첫번째(first) 부하 직원이 없을 경우
            managerNode->first = new node {subordinate, NULL, NULL};
        }
        else {    // (2) 2번째(second) 부하 직원이 없을 경우
            managerNode->second = new node {subordinate, NULL, NULL};
        }
        std::cout << manager << " 아래에 " << subordinate << "을(를) 추가했습니다." << std::endl;

        return true;
    }
};

int main() {
    auto tree = org_tree::create_org_structure("CEO");

    tree.addSubordinate("CEO", "부사장");
    tree.addSubordinate("부사장", "IT부장");
    tree.addSubordinate("부사장", "마케팅부장");
    tree.addSubordinate("IT부장", "보안팀장");
    tree.addSubordinate("IT부장", "앱개발팀장");
    tree.addSubordinate("마케팅부장", "물류팀장");
    tree.addSubordinate("마케팅부장", "홍보팀장");

    return 0;
}

 

결과 확인

CEO 아래에 부사장을(를) 추가했습니다.
부사장 아래에 IT부장을(를) 추가했습니다.
부사장 아래에 마케팅부장을(를) 추가했습니다.
IT부장 아래에 보안팀장을(를) 추가했습니다.
IT부장 아래에 앱개발팀장을(를) 추가했습니다.
마케팅부장 아래에 물류팀장을(를) 추가했습니다.
마케팅부장 아래에 홍보팀장을(를) 추가했습니다.
728x90
그리드형(광고전용)
⚠️AdBlock이 감지되었습니다. 원할한 페이지 표시를 위해 AdBlock을 꺼주세요.⚠️


📖 Contents 📖