응애맘마조

전위, 중위, 후위 노드 추가 탐색 및 삭제 본문

공부/3D과제

전위, 중위, 후위 노드 추가 탐색 및 삭제

TH.Wert 2023. 5. 1. 21:23

전위, 중위, 후위의 노드에 데이터를 추가하고 삭제 및 탐색하는 코드가 과제였습니다.

#include <iostream>
#include <vector>
#include <list>

using namespace std;

//노드
struct ListNode
{
    int data;
    ListNode* L = nullptr;
    ListNode* R = nullptr;

    ListNode(int data):data(data){}

    void Print()
    {
        cout << data << "->";
        if (L)L->Print();
        if (R)R->Print();
    }
    void Print1()
    {
        if (L)L->Print1();
        cout << data << "->";
        if (R)R->Print1();
    }
    void Print2()
    {
        if (L)L->Print2();
        if (R)R->Print2();
        cout << data << "->";
    }

    void Add(int data)
    {
        if (data > this->data)
        {
            if (R)
                R->Add(data);
            else
                R = new ListNode(data);
        }
        else if (data < this->data)
        {
            if (L)
                L->Add(data);
            else
                L = new ListNode(data);
        }
    }
    ListNode* GetMinNode()
    {
        if (L) return L->GetMinNode();
        return this;
    }
    ListNode* GetMaxNode()
    {
        if (R) return R->GetMaxNode();
        return this;
    }
    void Delete(int data, ListNode*& pthis)
    {
        if (this->data < data)
        {
            if (!R)return;

            R->Delete(data, R);
        }
        else if (this->data > data)
        {
            if (!L)return;

            L->Delete(data, L);
        }
        //나를 지워야 함
        else
        {
            if (not L and not R)
            {
                pthis = nullptr;
                delete this;
                return;
            }
            else if (L and not R)
            {
                pthis = L;
                delete this;
                return;
            }
            else if (not L and R)
            {
                pthis = R;
                delete this;
                return;
            }
            else
            {
                ListNode* max = L->GetMaxNode();
                this->data = max->data;
                L->Delete(this->data, L);
            }
        }
    }
    int findLevel(int data, int level)
    {
        if (this->data > data)
        {
            if (L)  return L->findLevel(data, level + 1);
        }
        else if (this->data < data)
        {
            if (R) return R->findLevel(data, level + 1);
        }
        return level;
    }
};

//기능을 제공하는 클래스
class BST
{
private:
    ListNode* root =nullptr;
    
public:
    void find(int data)
    {
        if (root)
        {
            cout << "레벨:" << root->findLevel(data,1) << endl;
            cout << "깊이:" << root->findLevel(data, 1) - 1 << endl;
        }

    }
    void push(int data)
    {
        if (root)
        {
            root->Add(data);
        }
        else
        {
            root = new ListNode(data);
        }
    }
    void erase(int data)
    {
        if (root)
        {
            root->Delete(data, root);
        }
    }
    void Print1()
    {
        cout << "전위:";
        if (root)
        {
            root->Print();
        }
        cout << endl;
    }
    void Print2()
    {
        cout << "중위:";
        if (root)
        {
            root->Print1();
        }
        cout << endl;
    }
    void Print3()
    {
        cout << "후위:";
        if (root)
        {
            root->Print2();
        }
        cout << endl;
    }
};

int main()
{
    BST list;
    while (1)
    {
        list.Print1();
        list.Print2();
        list.Print3();

        cout << "1. 데이터 추가 2. 데이터 삭제 3. 데이터 탐색" << endl;
        int input;
        cin >> input;
        if (input == 1)
        {
            cout << "추가할 데이터:";
            int input2;
            cin >> input2;
            list.push(input2);
        }
        if (input == 2)
        {
            cout << "삭제할 데이터:";
            int input2;
            cin >> input2;
            list.erase(input2);
        }
        if (input == 3)
        {
            cout << "탐색할 데이터:";
            int input2;
            cin >> input2;
            list.find(input2);
        }
    }

    int a;
    cin >> a;
}

코드입니다.

 

읽어주셔서 감사합니다.