ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자료구조...68
    일지 2021. 3. 22. 18:09

    이진 탐색 트리 삭제 메서드 구현

     

    BinarySearchTree.cpp

    /// <summary>
    /// BinarySearchTree에서 지정된 값을 가진 노드를 제거한다.
    /// </summary>
    /// <param name="value">제거할 값</param>
    void BinarySearchTree::Delete(int value)
    {
    	Node** target{ &m_root };
    	Node* parent{ nullptr };
    
    	while (*target != nullptr)
    	{
    		if ((*target)->m_data == value)
    		{
    			break;
    		}
    
    		if ((*target)->m_data > value)
    		{
    			parent = *target;
    			target = &((*target)->m_left);
    		}
    		else
    		{
    			parent = *target;
    			target = &((*target)->m_right);
    		}
    	}
    
    	if (parent == nullptr)
    	{
    		parent = m_root;
    	}
    
    	Node* deleteNode{ *target };
    
    	if (target != nullptr && *target != nullptr)
    	{
    		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->m_left == (*target))
    			{
    				parent->m_left = child;
    			}
    			else if (parent->m_right == (*target))
    			{
    				parent->m_right = child;
    			}
    		}
    		else if ((*target)->m_left != nullptr && (*target)->m_right != nullptr)
    		{
    			parent = *target;
    			Node* child{ (*target)->m_left };
    			while (child->m_right != nullptr)
    			{
    				parent = child;
    				child = child->m_right;
    			}
    
    			(*target)->m_data = child->m_data;
    			target = &child;
    			deleteNode = *target;
    
    			if (child->m_left != nullptr)
    			{
    				if (parent->m_left == child)
    				{
    					parent->m_left = child->m_left;
    				}
    				else if (parent->m_right == child)
    				{
    					parent->m_right = child->m_left;
    				}
    			}
    		}
    		else
    		{
    			
    			if (parent->m_left == (*target))
    			{
    				parent->m_left = nullptr;
    			}
    			else if (parent->m_right == (*target))
    			{
    				parent->m_right = nullptr;
    			}
    		}
    
    		PushNode(deleteNode);
    		m_count--;
    	}
    }

     

    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
        └  4
      └  8
        └  7
        └  9
    ----------------------

     

    4가 제거되지 않고 트리에 남아있다. 아마 제거 로직에 문제가 있는 것 같다. 내일 책을 참고해서 재작성해야 할 것 같다.

    댓글

Designed by Tistory.