https://leetcode.com/problems/reverse-odd-levels-of-binary-tree (leetcode)
DFS/BFS
DFS 사용해 재귀적으로 풀이
class Solution {
public TreeNode reverseOddLevels(TreeNode root) {
dfs(0 , root.left , root.right);
return root;
}
public void dfs(int depth , TreeNode node1 , TreeNode node2) {
if(node1 == null || node2 == null) return;
if(depth % 2 == 0) {
int temp = node1.val; //왼쪽 자식 노드의 값
node1.val = node2.val;
node2.val = temp;
}
//해당 왼쪽, 오른쪽으로 재귀적으로 처리를 진행한다.
dfs(depth+1 , node1.left , node2.right);
dfs(depth+1 , node1.right, node2.left );
}
}
만약 다음과 같이 완전 이진 트리가 있을 때 depth 가 홀수일때만 값을 change 한다.
즉, [2,3] , [8,9,10,11,,,,15] 일 때가 depth가 홀수이다.
그래서 3,2 의 "값만" swap을 하고 중요한 점은 자식노드가 바로 옆의 노드를 swap하는 게 아니라는 것이다.
예를 들어보자.
4 에는 left : 8 , right : 9가 있다.
5 에는 left : 10 , right : 11이 있다.
6 에는 left : 12 , right : 13이 있다.
7 에는 left : 14 , right : 15가 있다.
여기서 4가 노드일때 8,9 가 바뀌는 것이 아니라
4의 left:8 과 7의 right : 15 을 swap 하고
4의 right:9 와 7의 left : 14 를 swap 한다.
5의 left:10 과 6의 right : 13을 swap 하고
4의 right:11과 6의 left:12 를 스왑한다.
결과적으로 15 14 13 12 11 10 9 8 이 된다.
(사실 아직 잘 와닿지는 않는다. 계속 풀어보면서 감을 익혀야겠다.)
이 문제의 원 아이디어는 inverse Tree 이다.
노드의 자식노드를 서로 swap 하는 것을 의미하며 코드는 다음과 같이 심플하다.
public TreeNode reverseOddLevels(TreeNode root) {
if(root.left != null || root.right != null) {
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
//특정 노드의 왼쪽/오른쪽 자식 노드를 변경
//(이때 하위 노드들도 함께 이동)
reverseOddLevels(root.left);
reverseOddLevels(root.right);
}
return root;
}
다시 이 그림으로 예시를 들어보겠다.
root Node가 1 일때 자식인 2,3이 서로 swap 된다.
이때 2의 자식노드인 4,5 와 3의 자식노드인 6,7 도 , 그 하위도 함께 이동된다.
이후 각각 left , right 를 통해 재귀적으로 호출을 함으로써 모든 위치가 변경되는 것을 inverse Tree라고 한다.
(1) depth 가 홀수일때만 값을 바꾸되 노드자체가 아니라 "값만" 바꿔야 한다.
그래서 node 전체를 움직이지 않는다.
(2) 모든 대상을 바꾸는 게 아니라 depth가 홀수일 때만 변경한다.
inverseTree에 대한 dfs 풀이 방식을 응용할 수 있게 되었다.
그리고 좀 더 문제를 풀어봄으로써 체득을 해야겠다.
#99클럽 #코딩테스트 준비 #개발자 취업 #항해99 #TIL