컴공 일기182
게시글 주소: https://dev.orbi.kr/00058371421

객체지향... C++ 기반의 이진트리 간략 예제입니다.
Iterator는 구현은 따로 하지 않았는데, Iterator까지 구현을 해야 C++ 스러운 예제가 아닌가 해요.
무튼.. C 기반의 이진트리 설계랑 다른 것은, 아무래도 객체화가 되었다는 거겠죠.
여기서 문제는, 과연 "무엇을 객체화 시키느냐?" 일 겁니다. 이걸 따지는 게 굉장히 어렵습니다.
TreeNode class와 Tree의 class를 자연스럽게 분리시켜서, 모든 관계가 잘 정리되었습니다만, 이 흐름까지 초보 개발자 스스로 도달하는 데에는 굉장히 많은 시행착오와 고민들이 필요할 겁니다. 현재 제 상황이 이렇습니다.
그래선지 객체지향이 때로, 굉장히 어렵게 다가오는 것이 바로 이 지점입니다. 어떻게 설계를 하고, 무엇을 객체화 해야 하는가. 이것을 답해나가는 것이 현대 개발자의 임무 중 하나일텐데, 이게 참 쉽지 않습니다. 그래서, 공부 뿐 아니라, 개발에 대한 날렵한 경험들이 필요한 것 같구요.
using namespace std;
template <typename T>
class Tree;
template <typename T>
class TreeNode {
friend class Tree<T>;
private:
T data;
TreeNode* left;
TreeNode* right;
public:
//동적 할당을 받을 것은 딱히 아니므로 destructor에 대한 이슈는 크게 신경쓰지 말자.
TreeNode(T data = 0, TreeNode* left = null, TreeNode* right = null)
{
this->data = data;
this->left = left;
this->right = right;
}
};
template <typename T>
class Tree
{
private:
TreeNode<T>* Root;
public:
explicit Tree(const T data = 0)
{
Root = new TreeNode<T>(data);
}
void Destroy(const TreeNode<T>* Root)
{
preorder(Root->left);
preorder(Root->right);
delete Root;
}
~Tree()
{
Destroy(this->Root);
cout << endl;
cout << "deleting Tree..." << endl;
}
TreeNode<T>* getRoot()
{
return Root;
}
void visit(const TreeNode<T>* current)
{
cout << current->data << " ";
}
void buildTree() {
Root->left = new TreeNode<T>('B', new TreeNode<T>('D', new TreeNode<T>('H')), new TreeNode<T>('E', new TreeNode<T>('I'), new TreeNode<T>('J')));
Root->right = new TreeNode<T>('C', new TreeNode<T>('F'), new TreeNode<T>('G', null, new TreeNode<T>('K')));
}
void preorder(TreeNode<T>* current)
{
if (current != null) {
visit(current);
preorder(current->left);
preorder(current->right);
}
}
};
int main()
{
Tree<char> tree('A');
tree.buildTree();
cout << "Preorder >> " << endl;
tree.preorder(tree.getRoot());
cout << endl;
return 0;
}
0 XDK (+0)
유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.
-
좋아요 1 답글 달기 신고 -
좋아요 0 답글 달기 신고 -
