반응형
이진트리
# 최소한의 기능만 가진 이진트리 (라지만 꼭 있어야 하는 기능들이 아직 없는듯한...)
# 아무래도 미완성 느낌이 강하긴 하지만 추후에 내용을 추가하기로 결정.
# 현재로서는 트리에 노드를 추가하려면 수작업으로 노드를 찾아가서 노드를 추가하는 식으로 작업하도록 되어있다.
# 순회의 목적에 따라 함수포인터를 전달하도록 되어있기 때문에 이를 사용한 메인 함수도 함께 첨부했다.
# 다음 포스트는 '스레이드 이진트리'와 '수식 트리'까지 다루고, 바로 '우선순위 큐와 힙', '그래프'로 넘어간 뒤,
# 알고리즘 부분으로 넘어가서 탐색과 정렬에 관련된 자료구조를 다뤄야 할 듯 하다.
C++로 구현한 포인터 기반 이진트리
BinaryTree.h
#pragma once
template <typename T>
struct node
{
T data;
node* left;
node* right;
};
//트리 관련 전역 함수
template <typename T>
void ChangeData(node<T>* node, T data)
{
node->data = data;
}
template <typename T>
T& CheckData(node<T>* node)
{
return node->data;
}
template <typename T>
node<T>* MakeNode(T data)
{
node<T>* nn = new node<T>;
nn->data = data;
nn->left = nullptr;
nn->right = nullptr;
return nn;
}
//작업을 함수포인터로 전달받는 순회 함수
template <typename T>
void preorder(node<T>* node, void(*action)(T) )
{
if (node != nullptr) {
action(node->data);
preorder(node->left, action);
preorder(node->right, action);
}
}
template <typename T>
void inorder(node<T>* node, void(*action)(T))
{
if (node != nullptr) {
inorder(node->left, action);
action(node->data);
inorder(node->left, action);
}
}
template <typename T>
void postorder(node<T>* node, void(*action)(T))
{
if (node != nullptr) {
postorder(node->left, action);
postorder(node->right, action);
action(node->data);
}
}
template <typename T>
class BinaryTree
{
node<T>* rootNode;
private:
public:
//노드 포인터를 리턴하는 함수
node<T>* getRoot();
node<T>* getRight(node<T>* node);
node<T>* getLeft(node<T>* node);
//src트리를 Dest노드의 자식으로 붙임
bool connectLeft(node<T>* DestNode, node<T>* SrcTree);
bool connectRight(node<T>* DestNode, node<T>* SrcTree);
public:
BinaryTree(T data);
virtual ~BinaryTree();
};
template <typename T>
BinaryTree<T>::BinaryTree(T data)
{
rootNode = new node<T>;
rootNode->data = data;
rootNode->left = nullptr;
rootNode->right = nullptr;
}
template <typename T>
node<T>* BinaryTree<T>::getRoot()
{
return rootNode;
}
template <typename T>
node<T>* BinaryTree<T>::getLeft(node<T>* node)
{
return node->left;
}
template <typename T>
node<T>* BinaryTree<T>::getRight(node<T>* node)
{
return node->right;
}
template <typename T>
bool BinaryTree<T>::connectLeft(node<T>* DestNode, node<T>* srcTree)
{
if (DestNode->left == nullptr) {
DestNode->left = srcTree;
return true;
}
return false;
}
template <typename T>
bool BinaryTree<T>::connectRight(node<T>* DestNode, node<T>* srcTree)
{
if (DestNode->right == nullptr) {
DestNode->right = srcTree;
return true;
}
return false;
}
template <typename T>
BinaryTree<T>::~BinaryTree()
{
}
main.cpp
#include "BinaryTree.h"
#include <iostream>
void print(int data) {
std::cout << data << std::endl;
}
int main()
{
BinaryTree<int> bt(0);
std::cout << CheckData(bt.getRoot()) << std::endl;
BinaryTree<int> bt2(1);
bt2.connectLeft(bt2.getRoot(), MakeNode(2));
std::cout << CheckData(bt2.getLeft(bt2.getRoot())) << std::endl;
preorder(bt2.getRoot(), print);
}반응형