- toc {:toc}
Binary Tree
-
Property1 : ๊ฐ ๋ ธ๋๋ค์ ์ต๋ 2๊ฐ์ ์์์ ๊ฐ๋๋ค.
-
Property2 : ๋ฃจํธ๋ถํฐ ๋ค๋ฅธ ๋ ธ๋๊น์ง ์ ์ผํ ๊ธธ์ ๊ฐ๋๋ค.
-
ํฌํ ์ด์ง ํธ๋ฆฌ(Perfect Binary Tree) : ๋ฆฌํ ๋ ธ๋๊ฐ ์๋ ๋ชจ๋ ๋ ธ๋๋ค์ 2๊ฐ์ ์์์ ๊ฐ์ง๊ณ ๋ชจ๋ ๋ฆฌํ ๋ ธ๋๊ฐ ์ฐจ ์๋ ํธ๋ฆฌ๋ฅผ ๋งํ๋ค.
- i ๋ ๋ฒจ์์ ์ต๋ ๋
ธ๋ :
- i ๋ ๋ฒจ์์ ์ต๋ ๋
ธ๋ :
-
์ด์ง ๊ฒ์ ํธ๋ฆฌ
- ๋ชจ๋ ๋ ธ๋๋ค์ ๊ฒน์น์ง ์๋ ๊ณ ์ ํ ๋ฐ์ดํฐ ๊ฐ์ ๊ฐ์ง๋ค๊ณ ๊ฐ์ ํ๋ค.
- ํค๊ฐ์ ํฌ๊ณ ์๊ณ ๋ฅผ ๋น๊ตํ ์ ์๋ค.
- ์์ผ๋ฉด ์ผ์ชฝ ์๋ธํธ๋ฆฌ, ํฌ๋ฉด ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ๋ก ์ด๋ํ๋ค.
-
๊ฒ์ ์๊ฐ
- ์ต์ ์ ๊ฒฝ์ฐ - O(N)
- ์ต์ ์ ๊ฒฝ์ฐ - O(logN)
template<class ItemType>
struct TreeNode;
enum OrderType {PRE_ORDER, IN_ORDER, POST_ORDER};
template<class ItemType>
class TreeType {
public:
TreeType();
~TreeType();
TreeType(const TreeType<ItemType>&);
void operator=(const TreeType<ItemType>&);
void MakeEmpty();
bool IsEmpty() const;
bool IsFull() const;
int LengthIs() const;
void RetrieveItem(ItemType& item, bool& found);
void InsertItem(ItemType);
void DeleteItem(ItemType);
void ResetTree(OrderType);
void GetNextItem(ItemType&, OrderType, bool&);
void PrintTree(ofstream&) const;
private:
TreeNode<ItemType>* root;
};- ๋ ธ๋ ๊ฐ์ ์นด์ดํธ
int CountNodes(TreeNode* tree){
if (tree == NULL)
return 0;
else
return CountNodes(tree->left) + CountNodes(tree->right) + 1;
}- ๋ ธ๋ ์กด์ฌํ๋์ง ์ฐพ๊ธฐ
void RetrieveItem(ItemType& item, bool& found){
Retrieve(root, item, found);
}
void Retrieve(TreeNode* tree, ItemType& item, bool& found){
if (tree == NULL)
found=false;
else if (tree->info > item)
Retrieve(tree->left, item, found);
else if (tree->info < item)
Retrieve(tree->right, item, found);
else{
found = true;
}
}- ๋ ธ๋ ์ฝ์
void Insert(TreeNode*& tree, ItemType item){
if (tree == NULL){
tree = new TreeNode;
tree->right = NULL;
tree->left = NULL;
tree->info = item;
}
else if (tree->info > item)
Insert(tree->left, item);
else
Insert(tree->right, item);
}-
๋ ธ๋ ์ฝ์ ์ ์์น๋ฅผ ์ฐพ์๊ฐ์ ํฌ์ธํฐ ์กฐ์ ์ ํด์ค๋ค.
-
๋ํ, ์ด์ Sorted List์ ๊ฐ์ด ํฌ์ธํฐ์ ์ฃผ์๋ฅผ ์ง์ ํด์ค๋ค. ์ฆ, ๋ง์ฝ treeโinfo > item ์ธ ๊ฒฝ์ฐ treeโleft๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋๊ฒจ์ฃผ๋๋ฐ, ์ด๋ treeโleft์ new๋ก ๋์ ํ ๋น๋ฐ๊ธฐ ๋๋ฌธ์ ๋ถ๋ชจ์์ ํฌ์ธํฐ ์ฐ๊ฒฐ์ tree == NULL ์กฐ๊ฑด์์ ํด์ฃผ์ง ์์๋ ๋๋ค.
-
๋ ธ๋ ์ญ์
- ์์์ด ์๋ ๊ฒฝ์ฐ
- ์์์ด ํ๋๋ง ์๋ ๊ฒฝ์ฐ
- ์์์ด ๋ ๊ฐ ์๋ ๊ฒฝ์ฐ
void DeleteItem(ItemType item){
Delete(root, item);
}
void Delete(TreeNode*& tree, ItemType item){
// ํด๋น item์ด ์๋ ์์น๊น์ง ์ด๋ํ๋ค.
if (tree == NULL){
return;
}
if (item < tree->info){
Delete(tree->left, item);
}
else if (item > tree->info){
Delete(tree->right, item);
}
else{ // ์ฐพ์ผ๋ฉด DeleteNode๋ฅผ ํ๋ค.
DeleteNode(tree);
}
}
void DeleteNode(TreeNode*& tree){
ItemType data;
TreeNode* tempPtr;
tempPtr = tree;
if (tree->left == NULL)
{
tree = tree->right; // ๋ถ๋ชจ ๋
ธ๋๊ฐ ์ค๋ฅธ์ชฝ ํ์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๊ธฐ.
delete tempPtr;
}
else if (tree->right == NULL){
tree = tree->left; // ๋ถ๋ชจ ๋
ธ๋๊ฐ ์ผ์ชฝ ํ์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๊ธฐ.
delete tempPtr;
}
else{
while(tree->right != NULL){ // ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ๋งจ ์ค๋ฅธ์ชฝ ๋ฆฌํ ์ฐพ๊ธฐ
tree = tree->right;
}
data = tree->info;
tree->info = data; // ๋ฆฌํ ๋
ธ๋ ์ง์ด์๋ฆฌ๋ก ์ด๋
Delete(tree->left, data); // ์ฐพ์ ๋ฆฌํ ์ง์ฐ๊ธฐ
}
}Recursive Print
Inorder
- LDR (Left, Data, Right) ์์
- ํฌ๊ธฐ ์์๋๋ก ์ถ๋ ฅํ๋ ๊ฒฝ์ฐ inorder ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
void InOrder(TreeNode* tree, QueType& inQue){
if(tree != NULL){
InOrder(tree->left, inQue)
inQue.Enqueue(tree->info)
InOrder(tree->right, inQue)
}
}Preorder
- DLR (Data, Left, Right) ์์
- Constructor๋ฅผ ๋ง๋ค ๋ ๋ฃจํธ ๋ ธ๋๋ถํฐ ๋ง๋ค์ด์ผ ํ๊ธฐ ๋๋ฌธ์ preorder๋ฅผ ์ฌ์ฉํ๋ค.
- DFS์ ๊ฐ๋ค.
void PreOrder(TreeNode* tree, QueType& preQue){
if(tree != NULL){
preQue.Enqueue(tree->info);
PreOrder(tree->left, preQue);
PreOrder(tree->right, preQue);
}
}Postorder
- LRD (Left, Right, Data) ์์
- Destructor๋ฅผ ๋ง๋ค ๋ ๋ฆฌํ ๋ ธ๋๋ถํฐ ์ญ์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ postorder ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
void PostOrder(TreeNode* tree, QueType& postQue){
if(tree != NULL){
PostOrder(tree->left, postQue);
PostOrder(tree->right, postQue);
postQue.Enqueue(tree->info);
}
}Iterative Method
void FindNode(TreeNode* tree, ItemType item,
TreeNode*& nodePtr, TreeNode*& parentPtr){
nodePtr = tree;
parentPtr = NULL;
bool found = false;
while (nodePtr != NULL && !found){
if (item < nodePtr->info){
parentPtr = nodePtr;
nodePtr = nodePtr->left;
}
else if (item > nodePtr->info){
parentPtr = nodePtr;
nodePtr = nodePtr->right;
}
else found = true;
}
}
void TreeType::InsertItem(ItemType item)
{
TreeNode* newNode;
TreeNode* nodePtr;
TreeNode* parentPtr;
newNode = new TreeNode;
newNode->info = item;
newNode->left = NULL;
newNode->right = NULL;
FindNode(root, item, nodePtr, parentPtr);
if (parentPtr == NULL)
root = newNode;
else if (item < parentPtr->info)
parentPtr->left = newNode;
else parentPtr->right = newNode;
}
void TreeType::DeleteItem(ItemType item)
{
TreeNode* nodePtr;
TreeNode* parentPtr;
FindNode(root, item, nodePtr, parentPtr);
if (nodePtr == root)
DeleteNode(root);
else
if (parentPtr->left == nodePtr)
DeleteNode(parentPtr->left);
else
DeleteNode(parentPtr->right);
}