원래는 node를 하나 만들어서 List와 Set,Map이 같이 사용하도록 하려했는데

당연하게도 둘이 사용해야 할 노드가 성격이 다르다.

 

그래서 Node를 외부로 빼서 TreeNode와 ListNode를 따로 만들어주었다. 하지만, 두 노드간의 일관적인 인터페이스가 있어야 양방향 이터레이터에서 동일한 방식으로 자료구조를 다룰 수 있기 때문에 Node라는 최상위 클래스를 만들어서 그 안에 순수 가상함수를 선언해놓고 이를 상속받도록 하였다.

#pragma once

template<typename DataType>
class Node
{
public:
    virtual void operator=(const Node<DataType>* _Node) = 0;

    virtual Node<DataType>* operator++() = 0;
    virtual Node<DataType>* operator++(int) = 0;
    virtual Node<DataType>* operator--() = 0;
    virtual Node<DataType>* operator--(int) = 0;

    virtual const DataType& Get() = 0;
};

template<typename DataType>
class ListNode : public Node<DataType>
{
public:
    void operator=(const Node<DataType>* _Node)
    {
        const ListNode<DataType>* CastedNode = dynamic_cast<const ListNode<DataType>*>(_Node);

        Data = CastedNode->Data;
        PrevNode = CastedNode->PrevNode;
        NextNode = CastedNode->NextNode;
    }

    ListNode<DataType>* operator++() override
    {
        *this = NextNode;
        return this;
    }

    ListNode<DataType>* operator++(int) override
    {
        ++(*this);
        return PrevNode;
    }

    ListNode<DataType>* operator--() override
    {
        *this = PrevNode;
        return this;
    }

    ListNode<DataType>* operator--(int) override
    {
        --(*this);
        return NextNode;
    }

    const DataType& Get() override
    {
        return Data;
    }

    DataType Data;
    ListNode<DataType>* PrevNode = nullptr;
    ListNode<DataType>* NextNode = nullptr;
};

template<typename DataType>
class TreeNode : public Node<DataType>
{
public:
    enum NodeColor
    {
        None,
        Red,
        Black,
    };

    void operator=(const Node<DataType>* _Node)
    {
    }

    TreeNode<DataType>* operator++() override
    {
        return this;
    }

    TreeNode<DataType>* operator++(int) override
    {
        return nullptr;
    }

    TreeNode<DataType>* operator--() override
    {
        return nullptr;
    }

    TreeNode<DataType>* operator--(int) override
    {
        return nullptr;
    }

    const DataType& Get() override
    {
        return Data;
    }

    DataType Data;
    
    NodeColor Color = NodeColor::None;

    TreeNode<DataType>* Parent = nullptr;
    TreeNode<DataType>* LeftChild = nullptr;
    TreeNode<DataType>* RightChild = nullptr;
};

 

TreeNode는 아직 함수 구현은 하지 않은 상태이다. 먼저 Set을 만들고 그에 맞게 구조를 맞춰볼 생각이다.

+ Recent posts