Leetcode Java Delete Node in a BST
업데이트:
문제
코드
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
if (root == null) {
return null;
} else if (key < root.val) {
root.left = this.deleteNode(root.left, key);
} else if (key > root.val) {
root.right = this.deleteNode(root.right, key);
} else if (root.left == null) {
return root.right;
} else if (root.right == null) {
return root.left;
} else {
root.val = this.findMinValue(root.right);
root.right = this.deleteNode(root.right, root.val);
}
return root;
}
private int findMinValue(TreeNode root) {
while (root.left != null) {
root = root.left;
}
return root.val;
}
}
결과
설명
-
TreeNode인 root 내 val 값이 key와 동일한 노드를 제거하는 문제이다.
- root를 각 경우 별 검증을 통해 절차를 수행한다.
- root가 null인 경우 노드가 없으므로, null을 반환한다.
- key가 root의 val 값보다 작은 경우 해당 root 기준으로 key는 좌측 TreeNode에 존재하므로, root의 left TreeNode로 재귀 호출을 수행한다.
- key가 root의 val 값보다 큰 경우 해당 root 기준으로 key는 우측 TreeNode에 존재하므로, root의 right TreeNode로 재귀 호출을 수행한다.
- root의 left TreeNode가 null인 경우, root의 right TreeNode를 반환하여 검증하도록 한다.
- root의 right TreeNode가 null인 경우, root의 left TreeNode를 반환하여 검증하도록 한다.
- 그 외의 경우 root의 val 값이 key이므로, 아래를 수행하여 노드를 삭제하고 다음 노드를 이어준다.
- root의 val 값에 3번에서 정의한 findMinValue(TreeNode root) 메서드를 수행한 결과를 넣어준다.
- root의 right TreeNode에 root의 right TreeNode를 재귀 호출을 수행한 결과를 넣어준다.
- root 기준으로 가장 작은 값을 찾는 findMinValue(TreeNode root) 메서드를 정의한다.
- root의 left TreeNode가 null이 아닐 때 까지 반복하여, root에 root의 left TreeNode를 넣어준다.
- root 기준의 가장 작은 값을 찾은 root의 val 값을 반환한다.
- 수행이 완료되면 root를 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기