728x90
leetcode.com/problems/symmetric-tree/
첫 번째 시도 ( Fail )
리스트에 각 숫자를 담아서 맨 앞이랑 맨 뒤를 짝을 지어 비교하면 될 것이라고 생각하고 코드를 구현했다.
class Solution{
ArrayList<Integer> list = new ArrayList<>();
public void align(TreeNode root){
if (root != null){
align(root.left);
list.add(root.val);
align(root.right);
}
}
public boolean isSymmetric(TreeNode root) {
align(root);
for (int i = 0; i < list.size(); i++) {
if (list.get(list.size()-i-1) != list.get(i)){
return false;
}
}
return true;
}
}
이럴 경우, 레벨이 다른데 숫자가 같다면 false 가 나와야할 경우라도 true가 나오게 된다.
예) [1,2,2,2,null,2]
그래서 다시 문제를 생각해봤다.
루트 노드는 비교에 상관이 없고, 왼쪽 오른쪽 두개로 나누어서
1. 왼쪽 루트의 왼쪽과 오른쪽 루트의 오른쪽 비교
2. 왼쪽 루트의 오른쪽과 오른쪽 루트의 왼쪽 비교
를 비교하면 될 것이라고 아이디어는 구상했지만 코드로 구현하기 막막하고 생각이 안나서 영상을 봤다.
class Solution {
public boolean isSymmetric(TreeNode root) {
return root == null || check(root.left, root.right);
}
public boolean check(TreeNode left, TreeNode right){
if (left == null && right == null){
return true;
}
if (left == null || right == null){
return false;
}
return left.val == right.val && check(left.left, right.right) && check(left.right, right.left);
}
}
👩💻 root == null 이라면 참
거짓이라면, 루트의 왼쪽과 오른쪽 비교
👩💻 check(root.left, root.right)
루트 노드의 왼쪽, 오른쪽 자식노드를 받아왔으므로,
1. 해당 노드가 모두 null 이면 true
2. 둘 중 하나만 null 이라면 다른것이므로 false
3. 두 노드 모두 null 이 아니라면
val 값 비교 && 왼쪽 루트의 왼쪽과 오른쪽 루트의 오른쪽 비교 && 왼쪽 루트의 오른쪽과 오른쪽 루트의 왼쪽 비교
결과가 모두 참일 때만 참을 리턴
🔍 재귀함수 + boolean 값을 나타내는 부분에서 조건을 여러개 겹쳐서 return 하는 방식을 더 공부해야겠다.
728x90
'코딩테스트' 카테고리의 다른 글
[LeetCode] Delete Node in a Linked List (0) | 2021.05.06 |
---|---|
[LeetCode] Binary Tree Level Order Traversal (2) | 2021.05.03 |
[LeetCode] 98. Validate Binary Search Tree (0) | 2021.04.29 |
[LeetCode] Maximum Depth of Binary Tree (0) | 2021.04.27 |
[LeetCode] 1051. Height Checker (0) | 2021.04.24 |