본문 바로가기
::public/알고리즘

BinaryTree 구현.

by 해맑은욱 2019. 8. 23.

-트리의 용어

루트 노드(root node): 부모가 없는 노드. 트리는 단 하나의 루트 노드를 가짐.

서브 트리(sub tree): 루트 노드를 제외한 나머지 노드들.

링크(link): 루트 노드와 서브트리를 연결하는 선. 간선/에지(edge)라 부름.

형제(sibling): 같은 부모 노드를 가지는 노드.

단말 노드(leaf node): 자식 노드가 없는 노드.

 

노드의 크기(size): 자신을 포함한 모든 자손 노드의 개수.

노드의 깊이(depth): 루트 노드에서 어떤 노드에 도달하기 위해 거쳐야 하는 링크(간선)의 수.

노드의 레벨(level): 트리의 특정 깊이를 가지는 노드의 집합. (루트 = 1레벨)

노드의 차수(degree): 노드가 지닌 가지(간선)의 수.

트리의 차수(degree of tree): 트리의 최대 차수.

트리의 높이(height): 루트 노드에서 가장 깊숙히 있는 노드의 깊이.

 

-트리의 기본 성질

n개의 노드를 가진 트리는 n-1개의 링크(간선)을 가진다.

트리에서, 루트에서 어떤 노드로 가는 경로는 유일하다. 또한 임의의 두 노드 간의 경로도 유일하다.

(같은 노드를 두 번 이상 방문하지 않는 다는 조건 하에)

 

*이진 트리

각 노드는 최대 2개의 자식을 가진다.

각각의 자식 노드는 자신이 부모의 왼쪽 자식인지 오른쪽 자식인지가 지정된다. (자식이 하나일 경우도)

높이가 h인 이진트리는 2^h-1개 이하의 노드를 가진다.

 

-배열 표현법

노드 i의 부모 노드 인덱스 = i/2

노드 i의 왼쪽 자식 노드 인덱스 = 2i

노드 i의 오른쪽 자식 노드 인덱스 = 2i + 1

 

-이진트리의 순회 방법

전위 순회(root>left>right)

중위 순회(left>root>right)

후위 순회(left>right>root)

 

class BinaryNode
{
protected:
    int data;
    BinaryNode* left;
    BinaryNode* right;
public:
    BinaryNode(int value = 0, BinaryNode* l = NULL, BinaryNode* r = NULL
        : data(value), left(l), right(r)
    {}
    void setData(int value)
    {
        data = value;
    }
    void setLeft(BinaryNode* node)
    {
        left = node;
    }
    void setRight(BinaryNode* node)
    {
        right = node;
    }
    int getData()
    {
        return data;
    }
    BinaryNode* getLeft()
    {
        return left;
    }
    BinaryNode* getRight()
    {
        return right;
    }
    bool isLeaf()
    {
        return left == NULL && right == NULL;
    }
};
 
 
#include "BinaryNode.h"
 
class BinaryTree
{
private:
    BinaryNode* root;
public:
    BinaryTree() : root(NULL)
    {}
    void setRoot(BinaryNode* node)
    {
        root = node;
    }
    BinaryNode* getRoot()
    {
        return root;
    }
    bool isEmpty()
    {
        return root == NULL;
    }
 
    void preorder()
    {
        printf("\n  preorder: ");
        preorder(root);
    }
    void preorder(BinaryNode* node)
    {
        if (node != NULL)
        {
            printf(" [%c]", node->getData());
            preorder(node->getLeft());
            preorder(node->getRight());
        }
    }
    void inorder()
    {
        printf("\n   inorder: ");
        inorder(root);
    }
    void inorder(BinaryNode* node)
    {
        if (node != NULL)
        {
            inorder(node->getLeft());
            printf(" [%c]", node->getData());            
            inorder(node->getRight());
        }
    }    
    void postorder()
    {
        printf("\n postorder: ");
        postorder(root);
    }
    void postorder(BinaryNode* node)
    {
        if (node != NULL)
        {
            postorder(node->getLeft());
            postorder(node->getRight());
            printf(" [%c]", node->getData());
        }
    }
    void levelorder()
    {
        //
    }
 
    int getCount()
    {
        return isEmpty() ? 0 : getCount(root);
    }
    int getCount(BinaryNode* node)
    {
        if (node == NULL)
            return 0;
        else
            return 1 + getCount(node->getLeft()) + getCount(node->getRight());
    }
    int getHeight()
    {
        return isEmpty() ? 0 : getHeight(root);
    }
    int getHeight(BinaryNode* node)
    {
        if (node == NULLreturn 0;
        int hLeft = getHeight(node->getLeft());
        int hRight = getHeight(node->getRight());
        return (hLeft > hRight) ? hLeft + 1 : hRight + 1;
    }
    int getLeafCount()
    {
        return isEmpty() ? 0 : getLeafCount(root);
    }
    int getLeafCount(BinaryNode* node)
    {
        if (node == NULLreturn 0;
        if (node->isLeaf()) return 1;
        else return getLeafCount(node->getLeft()) + getLeafCount(node->getRight());
    }
};
cs

'::public > 알고리즘' 카테고리의 다른 글

탐색  (0) 2019.09.06
기수 정렬(Radix Sort)  (0) 2019.09.06
퀵 정렬(Quick Sort)  (0) 2019.07.11
알고리즘 시간 복잡도  (0) 2019.06.26
삽입 정렬(Insertion Sort)  (0) 2019.06.18