강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của hyu6301151506
hyu6301151506

câu hỏi đã được viết

Cấu trúc dữ liệu và giải thuật học dễ dàng bằng hình ảnh (Nâng cao)

Cây tìm kiếm nhị phân - Thực hiện loại bỏ

이진 탐색 트리 - 제거 구현 질문드립니다.

Đã giải quyết

Viết

·

406

1

자식 노드가 모두 존재하는 경우에 제거하는 경우의 수 중에서

제일 마지막 fakeParentRootNode 를 처리하는 부분에서 질문이 있습니다.

제거를 할 때 값을 변경하는 방식으로 진행하다보니 루트노드가 제거가 된다고 하더라도 fakeParentRootNode의 오른쪽 자식노드는 계속해서 root 노드의 주소값을 바라보고 있을 것이고, 변경사항이 없을텐데 해당 코드를 넣는 이유가 있을까요?

if (fakeParentRootNode.getRightSubTree() !== this.root) {
   this.root = fakeParentRootNode.getRightSubTree();
}
알고리즘

Câu trả lời 1

1

gamja5님의 프로필 이미지
gamja5
Người chia sẻ kiến thức

루트노드가 18, 왼쪽 자식노드가 15 하나 있는 트리로 가정해보겠습니다.

만약 루트노드(18)를 삭제하는 경우 else if문(자식 노드가 1개 있는 조건문)이 실행됩니다.
이 조건문에서는 아래 코드와 같이 자식 노드를 값이 아닌 주소를 바꿉니다.

        }else if(deletingNode.getLeftSubTree() == null || deletingNode.getRightSubTree() == null){
            let deletingNodeChild;

            if(deletingNode.getLeftSubTree() != null){
                deletingNodeChild = deletingNode.getLeftSubTree();
            }else{
                deletingNodeChild = deletingNode.getRightSubTree();
            }

            if(parentNode.getLeftSubTree() == deletingNode){
                parentNode.setLeftSubTree(deletingNodeChild); 
            }else{
                parentNode.setRightSubTree(deletingNodeChild); // fakeParentRootNode의 오른쪽 자식노드가 15인 노드가 됨.
            }

 

따라서 해당 케이스에 바뀐 루트노드를 다시 설정하는 것입니다.

궁금증이 해결되셨나요? 😀

hyu6301151506님의 프로필 이미지
hyu6301151506
Người đặt câu hỏi

감사합니다! 해결되었습니다.

Hình ảnh hồ sơ của hyu6301151506
hyu6301151506

câu hỏi đã được viết

Đặt câu hỏi