์ž๋ฃŒ ๊ตฌ์กฐ

ํŠธ๋ฆฌ ๊ฐœ๋… ๋ฐ ๊ตฌํ˜„

youngdeok 2023. 2. 28. 19:14

ํŠธ๋ฆฌ๋Š” ๋‹ค๋ฅธ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ๋‹ค๋ฅด๊ฒŒ ๋น„์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ํŠธ๋ฆฌ๋Š” ๊ฐ€์ง€๋ฅผ ๋ป—์–ด ๋‚˜์•„๊ฐ„๋‹ค.

ํŠธ๋ฆฌ์˜ ์ถ”์ƒ ์ž๋ฃŒํ˜•

BTreeNode *MakeBtreeNode(void);

  • ์ด์ง„ ํŠธ๋ฆฌ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ทธ ์ฃผ์†Œ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

BTData GetData(BTreeNode *bt);

  • ๋…ธ๋“œ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

void SetData(BTreeNode *bt, BTData data);

  • ๋…ธ๋“œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. data๋กœ ์ „๋‹ฌ๋œ ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.

BTreeNode *GetLeftSubTree(BTreeNode *bt);

  • ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ์ฃผ์†Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

BTreeNode *GetRIghtSubTree(BTreeNode *bt);

  • ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์˜ ์ฃผ์†Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

void MakeLeftSubTree(BTreeNode *main, BTreeNode *sub);

  • ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค.

void MakeRightSubTree(BTreeNode *main, BTreeNode *sub);

  • ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค.

ํŠธ๋ฆฌ์˜ ๊ฒฝ์šฐ ๊ฐœ๋…๊ณผ ๊ตฌํ˜„์„ ๊ฐ™์ด ๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์„œ ํ•œ๊ณณ์— ์ •๋ฆฌํ•ด๋ณธ๋‹ค.

BinaryTree.h

#ifndef __BINARY_TREE_H__
#define __BINARY_TREE_H__

#define TRUE    1
#define FALSE   0

typedef int BTData;

typedef struct _bTreeNode
{
    BTData data;
    struct _bTreeNode *left; // ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ์œ„ํ•œ ๋ณ€์ˆ˜
    struct _bTreeNode *right; // ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ์œ„ํ•œ ๋ณ€์ˆ˜
} BTreeNode;

BTreeNode *MakeBtreeNode(void);  // ๋…ธ๋“œ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ด ์ฃผ๋Š” ํ•ซ๋ฌด
BTData GetData(BTreeNode *bt);
void SetData(BTreeNode *bt, BTData data);
BTreeNode *GetLeftSubTree(BTreeNode *bt);
BTreeNode *GetRIghtSubTree(BTreeNode *bt);
void MakeLeftSubTree(BTreeNode *main, BTreeNode *sub); // ์™ผ์ชฝ ์—ฐ๊ฒฐ
void MakeRightSubTree(BTreeNode *main, BTreeNode *sub); // ์˜ค๋ฅธ์ชฝ ์—ฐ๊ฒฐ

#endif

BinaryTree.c

#include <stdio.h>
#include <stdlib.h>
#include "BinaryTree.h"

BTreeNode *MakeBtreeNode(void) // intializer
{
    BTreeNode *newNode = (BTreeNode *)malloc(sizeof(BTreeNode));
    newNode->left = NULL;
    newNode->right = NULL;

    return newNode;
}

BTData GetData(BTreeNode *bt)
{
    return bt->data;
}
void SetData(BTreeNode *bt, BTData data)
{
    bt->data = data;
}
BTreeNode *GetLeftSubTree(BTreeNode *bt)
{
    return bt->left;
}
BTreeNode *GetRIghtSubTree(BTreeNode *bt)
{
    return bt->right;
}
void MakeLeftSubTree(BTreeNode *main, BTreeNode *sub)
{
    if (main->left == NULL) // ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๊ฐ€ ์ด๋ฏธ ์กด์žฌ ํ• ์‹œ ์ œ๊ฑฐ ํ›„ ์—ฐ๊ฒฐ
        free(main->left);
    main->left = sub;
}
void MakeRightSubTree(BTreeNode *main, BTreeNode *sub)
{
    if (main->right == NULL)// ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ๊ฐ€ ์ด๋ฏธ ์กด์žฌ ํ• ์‹œ ์ œ๊ฑฐ ํ›„ ์—ฐ๊ฒฐ
        free(main->right);
    main->right = sub;
}

BinaryTree.h

#ifndef __BINARY_TREE_H__
#define __BINARY_TREE_H__

#include <iostream>

typedef int BTData;

class BTreeNode
{
private:
    BTData data;
    BTreeNode *left;
    BTreeNode *right;
public:
    BTreeNode();
    BTreeNode *MakeBtreeNode();
    BTData GetData();
    void SetData(BTData data);
    BTreeNode *GetLeftSubTree();
    BTreeNode *GetRIghtSubTree();
    void MakeLeftSubTree(BTreeNode *sub);
    void MakeRightSubTree(BTreeNode *sub);
    void RemoveNode();
};

#endif

BinaryTree.cpp

#include "BinaryTree.h"
#include <iostream>

BTreeNode::BTreeNode() // ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ดˆ๊ธฐํ™” ํ•ด์ค€๋‹ค.
{
    left = NULL;
    right = NULL;
}

// BTreeNode *BTreeNode::MakeBtreeNode() // main์—์„œ ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ด ์ค„ ๊ฒƒ์ด๊ธฐ ๋–„๋ฌธ์— 
																					// ๊ตณ์ด ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.
// {
//     BTreeNode *bt = new BTreeNode;
//     bt->left = NULL;
//     bt->right = NULL;

//     return bt;
// }

BTData BTreeNode::GetData()
{
    return data;
}
void BTreeNode::SetData(BTData _data)
{
    data = _data;
}
BTreeNode *BTreeNode::GetLeftSubTree()
{
    return left;
}
BTreeNode *BTreeNode::GetRIghtSubTree()
{
    return right;
}
void BTreeNode::MakeLeftSubTree(BTreeNode *sub)
{
    left = sub;
}
void BTreeNode::MakeRightSubTree(BTreeNode *sub)
{
    right = sub;
}

void BTreeNode::RemoveNode()
{
    BTreeNode *dTree = this;
    if (dTree == NULL) 
        return ;
    dTree->GetLeftSubTree()->RemoveNode();
    dTree->GetRIghtSubTree()->RemoveNode();
    std::cout << data << std::endl;
    delete dTree;
}

ํŠธ๋ฆฌ์˜ ์ถœ๋ ฅ์€ ์žฌ๊ท€๋ฅผ ํ†ตํ•ด ์ด๋ค„์ง€๋Š”๋ฐ

void printData(BTreeNode *main)
{
    if (main == NULL)
        return ;
    printData(main->left);
    printf("%d ", main->data);
    printData(main->right);
}

์ „์œ„ ์ค‘์œ„ ํ›„์œ„ ์ˆœํšŒ๋ฅผ ํ†ตํ•ด๊ตฌํ˜„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์œ„์˜ ์ฝ”๋“œ ์ฒ˜๋Ÿผ ๋ง์ด๋‹ค. ์œ„ ์ฝ”๋“œ๋Š” ์ค‘์œ„์ˆœํšŒ๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ ํ•˜์˜€๋‹ค. ๋งจ ์™ผ์ชฝ ๋…ธ๋“œ๋กœ ์ด๋™→์˜ค๋ฅธ์ชฝ ๋…ธ๋“œ ์ด๋™ → ์ถœ๋ ฅ → ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ ์˜ ๋ฐฉ์‹์„ ํ†ตํ•ด ๊ตฌํ˜„ํ–ˆ๋‹ค. ํƒˆ์ถœ์€ ๋…ธ๋“œ๊ฐ€ null์„ ๊ฐ€๋ฅดํ‚ค๊ฒŒ ๋˜๋ฉด ํƒˆ์ถœ ํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

void RemoveNode(BTreeNode *main)
{
    if (main == NULL)
        return ;
    RemoveNode(main->left);
    RemoveNode(main->right);
    printf("%d ",main->data);
    free(main);
}

์‚ญ์ œ ์—ญ์‹œ ์ถœ๋ ฅ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•œ๋‹ค.

 

ํž™ ์ฝ”๋“œ: https://boiling-fowl-6d6.notion.site/Heap-e0df3107d7d344c7b02f36b9736a499f

'์ž๋ฃŒ ๊ตฌ์กฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

ํ…Œ์ด๋ธ”๊ณผ ํ•ด์‰ฌ ๊ฐœ๋…  (0) 2023.02.28
ํž™ ๊ฐœ๋…  (0) 2023.02.28
ํ ๊ฐœ๋…  (0) 2023.02.28
์Šคํƒ ๊ฐœ๋…  (0) 2023.02.28
์ž๋ฃŒ ๊ตฌ์กฐ ์ด ์ •๋ฆฌ  (0) 2023.02.28