오늘의 학습 키워드
공부한 내용 본인의 언어로 정리하기
/**
* 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 boolean isSymmetric(TreeNode root) {
if (root == null) {
return true;
}
return isMirror(root.left, root.right);
}
private boolean isMirror(TreeNode left, TreeNode right) {
//두 값이 모두 null일 경우 같으므로 true 반환
if (left == null && right == null) {
return true;
}
//left 또는 right 둘 중 하나의 값이 null일 경우 NullPointerException이 발생하는 오류가 있었음
if(left == null || right == null) {
return false;
}
//각각 chech로 비교하는 것 보다 isMirror로 사용하는 것이 명시적으로 알아보기 더 좋을 것 같아서 사용하였음
return (left.val == right.val) && isMirror(left.left, right.right) && isMirror(left.right, right.left);
}
}
오늘의 회고
오늘은 이진 탐색 트리를 이어서 Symmetric Tree
(대칭 트리)의 문제가 나왔다. 오늘은 어제 이진 탐색 트리와 노드에 대해서 살짝이나마 공부를 하고 나서 그런지 양 쪽의 값을 비교해서 맞으면 true
를 반환하고 아니면 false
를 반환해야겠다는 생각이 바로 들었다. 그래서 처음 적혀있는 코드에 상위 root
가 같은 경우 true
를 반환해주고 하위 루트를 비교하는 방향으로 만들었다.
public boolean isSymmetric(TreeNode root) {
if (root == null) {
return true;
}
return isMirror(root.left, root.right);
}
그리고 하위 노드들을 비교하기 위한 isMirror
메서드를 생성하였다. 이 메서드는 재귀적 접근법을 사용하여 트리의 대칭성을 확인할 수 있다.
트리의 모든 레벨을 탐색하여 올바른 값을 반환해주기 위하여
양쪽의 노드가 같은 경우 true
를 반환해주어야 했다.
그리고 isMirror
메서드를 사용해 3개의 경우의 수를 모두 비교해서 값을 반환해 주어야했다.
private boolean isMirror(TreeNode left, TreeNode right) {
//두 값이 모두 null일 경우 같으므로 true 반환
if (left == null && right == null) {
return true;
}
//각각 chech로 비교하는 것 보다 isMirror로 사용하는 것이 명시적으로 알아보기 더 좋을 것 같아서 사용하였음
return (left.val == right.val) && isMirror(left.left, right.right) && isMirror(left.right, right.left);
}
이렇게 실행했더니 NullPointException
이 나왔고 left
또는 right
둘 중의 하나의 값이 null
일 경우 NullPointException
이 발생한다는 것을 알았고 함수를 추가해주었다.
//left 또는 right 둘 중 하나의 값이 null일 경우 NullPointerException이 발생하는 오류가 있었음
(left == null || right == null) {
return false;
}
AI 코드리뷰
현재 코드의 장점
null
체크와 left.val
과 right.val
의 비교 등 필수적인 조건을 잘 검사하고 있습니다.현재 코드의 단점
isMirror
메서드 내의 조건 검사 코드가 다소 중복되어 보입니다. 이를 간단하게 할 수 있는 방법이 있습니다.isMirror
메서드의 이름이 적절하긴 하지만, 대칭성을 확인하는 다른 이름으로 더 명확히 할 수 있습니다.시간 복잡도
시간 복잡도: O(n)
내 코드와 계속 같은 코드를 제시해 주어서 더 효율적인 방법으로 시간복잡도를 줄여서 만들어달라고 해보았다.
import java.util.LinkedList;
import java.util.Queue;
class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null) {
return true;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root.left);
queue.add(root.right);
while (!queue.isEmpty()) {
TreeNode left = queue.poll();
TreeNode right = queue.poll();
if (left == null && right == null) {
continue;
}
if (left == null || right == null || left.val != right.val) {
return false;
}
queue.add(left.left);
queue.add(right.right);
queue.add(left.right);
queue.add(right.left);
}
return true;
}
}
개선된 버전의 장점:
시간 복잡도: O(n)
내일 공부할 것 :
NullPointerException
같은 일반적인 예외를 어떻게 다루는지에 대해 공부해보세요. 이는 코드의 안정성과 신뢰성을 높이는 데 도움이 됩니다.문제