Computer Science

[자료구조] Binary Tree

kk_eezz 2022. 5. 24. 15:08

Linked representation을 통해 구현한 Tree

 

TreeNode 클래스.

Tree 클래스가 TreeNode 클래스의 private data 멤버를 접근해야하기 때문에 friend로 지정해준다.

template<class T> class Tree;
template<class T>
class TreeNode {
    friend class Tree<T>;
private:
    T data;
    TreeNode<T> *leftChild;
    TreeNode<T> *rightChild;
public:
    TreeNode(const T& e){
        data = e;
        leftChild = 0;
        rightChild = 0;
    }
};

 

Tree 클래스

LevelOrder() 함수, Inorder() 함수를 통해 level order, inorder traversal을 구현했다.

template<class T>
class Tree {
public:
    Tree(const T& e){
        root = new TreeNode<T>(e);
    }
    TreeNode<T>* AddNode(TreeNode<T> *x,bool isLeft, const T& e){
        if(x && isLeft) {
            x->leftChild = new TreeNode<T>(e);
            return x->leftChild;
        } else if(x && !isLeft) {
            x->rightChild = new TreeNode<T>(e);
            return x->rightChild;
        } else {
            return 0;
        }
    }
    void AddNode(TreeNode<T> *x,bool isLeft, TreeNode<T> *newNode){
        if(x && isLeft) {
            x->leftChild = newNode;
        } else if(x && !isLeft) {
            x->rightChild = newNode;
        }
    }
    vector<T> LevelOrder() {
        vector<T> v;
        queue<TreeNode<T>*> q;
        TreeNode<T> *currentNode = root;
        while(currentNode) {
            v.push_back(currentNode->data);
            if(currentNode->leftChild) q.push(currentNode->leftChild);
            if(currentNode->rightChild) q.push(currentNode->rightChild);
            if(q.empty()) return v;
            currentNode = q.front();
            q.pop();
        }
        return v;
    }
    void inorderTraverse(TreeNode<T>* self) {
        if(self==0) return;
        inorderTraverse(self->leftChild);
        v.push_back(self->data);
        inorderTraverse(self->rightChild);
    }
    vector<T> Inorder() {
        v.clear();
        inorderTraverse(root);
        return v;
    }
    
    TreeNode<T>* getRoot(){
        return root;
    }
private:
    TreeNode<T> *root;
    vector<T> v;
};

 

밑의 main 함수를 실행한 결과

int main(void) {
    Tree<string> tree("+");
    tree.AddNode(tree.getRoot(), false, "E");
    TreeNode<string> *x2 = new TreeNode<string>("*");
    TreeNode<string> *x4 = new TreeNode<string>("*");
    tree.AddNode(tree.getRoot(), true, x2);
    tree.AddNode(x2, true, x4);
    tree.AddNode(x2, false, "D");
    TreeNode<string> *x6 = new TreeNode<string>("/");
    tree.AddNode(x4, true, x6);
    tree.AddNode(x4, false, "C");
    tree.AddNode(x6, true, "A");
    tree.AddNode(x6, false, "B");
    
    vector<string> v = tree.LevelOrder();
    
    for(int i=0;i<v.size();i++)
        cout << v[i];
    cout << endl;
    
    vector<string> v2 = tree.Inorder();
    
    for(int i=0;i<v2.size();i++)
        cout << v2[i];
    
    cout << endl;
}