ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [자료구조] Binary Tree
    Computer Science 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;
    }

    'Computer Science' 카테고리의 다른 글

    [OS] System Call Handling  (2) 2024.04.10
    [자료구조] Circular Lists  (0) 2022.05.23
    [자료구조] 체인  (0) 2022.05.17

    댓글

Designed by Tistory.