삭제할 노드가 자식을 2개 갖고 있는 경우


<aside>

// 삭제할 노드가 자식 노드를 두 개 가진 경우
else {
	// 후보 초기화 과정
	succ_parent = p;
	succ = p->left;
	// 왼쪽에서 가장 큰 노드 찾기
	// 왼쪽 자식의 오른쪽 끝까지 내려감 -> 가장 큰 값
	while (succ->right != NULL)
	{
		succ_parent = succ;
		succ = succ->right;
	}
	// succ이 succ_parent의 왼쪽 자식인지 오른쪽 자식인지 구분하여 포인터 조정
	// succ가 부모의 왼쪽 자식인 경우
	if (succ_parent->left == succ)
	{
		succ_parent->left = succ->left;
	}
	else
	{
		succ_parent->right = succ->left;
		p->key = succ->key;
		p = succ;
	}
}

</aside>

설명


<aside>

        50(p)
       /  \\
     30    70
    /  \\
  20    40(succ) ===> 삭제할 노드 왼쪽 자식의 오른쪽까지 이동
        /
      35

        40   ← p->key = 40 ===> succ를 root로 이동
       /  \\
     30    70
    /  \\
  20    35   ← 30->right = 35 ===> succ_parent->right = succ->left로 이동한 노드(succ)의 부모(succ_parent)의 자식 노드 자리에 이동한 노드의 자식 노드(succ)를 연경

</aside>