오늘 할일
1. 창엔 업무_11차 초대 및 이전회차 검토
2. LeetCode
3. 인턴 or 현장실습 지원하기
4. 인공지능 개론 Car_evaluation 과제
오늘 한일
1. LeetCode
기존에 실패했던 문제를 다시 읽어보자
순차적으로 생각해보자. 노드를 삭제할 경우 자식 노드 중 하나를 올리게 된다. 그러면 직선상태의 그래프가 되고, 추가적인 정렬이 필요하다면 LL회전 RR회전으로 균형을 맞춘다. 만약 삭제하고자하는 노드가 루트노드라면? 자식 노드를 올리는 게 아니라 특정 말단 노드를 올릴 수도 있다. 즉, 자식 노드를 올린다는 것은 틀렸다.
가설1) 노드를 삭제할 경우 노드에서 가장 크기가 가까운 노드를 올린다. 이 경우 좌우측 자식노드에서 가장 가까운 정도가 동일한 두개의 노드가 존재할 수 있다.
가설2) 자신이 부모노드로부터 왼쪽에 있다면 우측 자식노드를, 오른쪽에 있다면 좌측 자식노드를 올린다.
이 경우 삭제하고자 하는 노드가 루트면 부모노드를 정할 수 없다.
가설3) 노드를 삭제할 경우 자신과 가장 가까운 값을 가진 하위 노드와 바꾼다. 이 과정에서 직선에 가까운 트리가 발생하면 LL회전, RR회전으로 균형을 맞춘다.
인터넷) 우측 노드에서 가장 좌측값 노드로 끼워넣는다.
class Solution {
private TreeNode left_most(TreeNode node){
TreeNode cur=node;
while(cur.left!=null){
cur=cur.left;
}
return cur;
}
private void remove(TreeNode node, int key){
if(node==null)
return;
if(node.val<key){
remove(node.right, key);
} else if(node.val>key){
remove(node.left, key);
} else{
TreeNode swap_node=left_most(node.right);
node.val=swap_node.val;
}
}
public TreeNode deleteNode(TreeNode root, int key){
if(root==null || (root.val==key && root.left==null && root.right==null))
return null;
remove(root, key);
return root;
}
}
굉장히 어렵다... 오늘 이 문제를 꼭 정복해보자..