일지
자료구조...69
niamdank
2021. 3. 23. 20:48
이진 탐색 트리 삭제 메서드 구현
BinarySearchTree.cpp
/// <summary>
/// BinarySearchTree에서 지정된 값을 가진 노드를 제거한다.
/// </summary>
/// <param name="value">제거할 값</param>
void BinarySearchTree::Delete(int value)
{
if (m_root == nullptr)
{
return;
}
Node* target{ m_root };
Node* parent{ nullptr };
while ((target != nullptr) && (target->m_data != value))
{
parent = target;
if (target->m_data > value)
{
target = target->m_left;
}
else
{
target = target->m_right;
}
}
if (target == nullptr)
{
return;
}
if (target->m_left == nullptr && target->m_right == nullptr)
{
if (parent == nullptr)
{
m_root = nullptr;
}
else if (parent->m_left == target)
{
parent->m_left = nullptr;
}
else
{
parent->m_right = nullptr;
}
}
else if (target->m_left != nullptr && target->m_right == nullptr
|| target->m_left == nullptr && target->m_right != nullptr)
{
Node* child{ target->m_left != nullptr ? target->m_left : target->m_right };
if (parent == nullptr)
{
m_root = child;
}
else if(parent->m_left == target)
{
parent->m_left = child;
}
else
{
parent->m_right = child;
}
}
else
{
parent = target;
Node* successor{ target->m_left };
while (successor->m_right != nullptr)
{
parent = successor;
successor = successor->m_right;
}
if (parent->m_left == successor)
{
parent->m_left = successor->m_left;
}
else
{
parent->m_right = successor->m_left;
}
target->m_data = successor->m_data;
target = successor;
}
PushNode(target);
}
main.cpp
#include <iostream>
#include "BinarySearchTree/BinarySearchTree.h"
// 생성한 자료구조 테스트용 메인
int main()
{
BinarySearchTree bst;
bst.Insert(5);
bst.Insert(3);
bst.Insert(1);
bst.Insert(0);
bst.Insert(4);
bst.Insert(8);
bst.Insert(7);
bst.Insert(9);
bst.PrintInfo();
bst.Delete(5);
bst.PrintInfo();
}
실행 결과
----------------------
└ 5
└ 3
└ 1
└ 0
└ 4
└ 8
└ 7
└ 9
----------------------
----------------------
└ 4
└ 3
└ 1
└ 0
└ 8
└ 7
└ 9
----------------------