Skip to content

Commit 8397436

Browse files
committedAug 18, 2020
feat: 이진 탐색 트리 데이터 제거 기능 추가
1 parent c3e2090 commit 8397436

File tree

1 file changed

+84
-1
lines changed

1 file changed

+84
-1
lines changed
 

‎yoonexample/src/main/java/search/binarysearchtree/LinkedBinarySearchTreeNode.java

+84-1
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66

77
public class LinkedBinarySearchTreeNode<E> implements BinarySearchTreeNode<E> {
88

9-
private final BinaryTreeNode<E> node;
109
private final Comparator<E> comparator;
10+
private BinaryTreeNode<E> node;
1111

1212
public LinkedBinarySearchTreeNode(E data, Comparator<E> comparator) {
1313
this.node = new LinkedBinaryTreeNode<>(data);
@@ -62,4 +62,87 @@ public void insert(E data) {
6262
parentNode.setRightSubTree(newNode);
6363
}
6464
}
65+
66+
@Override
67+
public BinaryTreeNode<E> remove(E target) {
68+
BinaryTreeNode<E> rootDummyNode = new LinkedBinaryTreeNode<>(null);
69+
BinaryTreeNode<E> parentNode = rootDummyNode;
70+
BinaryTreeNode<E> currentNode = this.node;
71+
BinaryTreeNode<E> deleteNode;
72+
73+
rootDummyNode.changeRightSubTree(this.node);
74+
75+
while (currentNode != null && currentNode.getData() != target) {
76+
parentNode = currentNode;
77+
if (comparator.compare(target, currentNode.getData()) < 0) {
78+
currentNode = currentNode.getLeftSubTree();
79+
} else {
80+
currentNode = currentNode.getRightSubTree();
81+
}
82+
}
83+
84+
if (currentNode == null) { // 삭제 대상이 조회되지 않은 경우
85+
return null;
86+
}
87+
88+
deleteNode = currentNode;
89+
90+
if (deleteNode.getLeftSubTree() == null && deleteNode.getRightSubTree() == null) {
91+
// 삭제 대상이 단말 노드인 경우
92+
if (parentNode.getLeftSubTree() == deleteNode) {
93+
parentNode.removeLeftSubTree();
94+
} else {
95+
parentNode.removeRightSubTree();
96+
}
97+
} else if (deleteNode.getLeftSubTree() == null || deleteNode.getRightSubTree() == null) {
98+
// 삭제 대상이 하나의 자식 노드를 갖는 경우
99+
BinaryTreeNode<E> childNode;
100+
101+
if (deleteNode.getLeftSubTree() != null) {
102+
childNode = deleteNode.getLeftSubTree();
103+
} else {
104+
childNode = deleteNode.getRightSubTree();
105+
}
106+
107+
if (parentNode.getLeftSubTree() == deleteNode) {
108+
parentNode.changeLeftSubTree(childNode);
109+
} else {
110+
parentNode.changeRightSubTree(childNode);
111+
}
112+
} else {
113+
// 둘 다 있는 경우
114+
BinaryTreeNode<E> moveNode = deleteNode.getRightSubTree();
115+
BinaryTreeNode<E> moveParentNode = deleteNode;
116+
117+
// 삭제 대상의 대체 노드 찾기
118+
while (moveNode.getLeftSubTree() != null) {
119+
moveParentNode = moveNode;
120+
moveNode = moveNode.getLeftSubTree();
121+
}
122+
123+
// 대체 노드의 부모 노드와 자식 노드 연결
124+
if (moveParentNode.getLeftSubTree() == moveNode) {
125+
moveParentNode.changeLeftSubTree(moveNode.getRightSubTree());
126+
} else {
127+
moveParentNode.changeRightSubTree(moveNode.getRightSubTree());
128+
}
129+
130+
// 삭제 노드의 하위 노드를 대체 노드에 연결
131+
moveNode.changeLeftSubTree(deleteNode.getLeftSubTree());
132+
moveNode.changeRightSubTree(deleteNode.getRightSubTree());
133+
134+
// 부모 노드의 하위 노드 변경
135+
if (parentNode.getLeftSubTree() != deleteNode) {
136+
parentNode.changeRightSubTree(moveNode);
137+
} else {
138+
parentNode.changeLeftSubTree(moveNode);
139+
}
140+
}
141+
142+
if (rootDummyNode.getRightSubTree() != this.node) {
143+
this.node = rootDummyNode.getRightSubTree();
144+
}
145+
146+
return deleteNode;
147+
}
65148
}

0 commit comments

Comments
 (0)
Please sign in to comment.