
문제링크
530. Minimum Absolute Difference in BST
기억하면 좋을 것
내가 풀고싶은대로 풀었더니 Time Limit Exceeded 에러가 난다. O(n^2)
내가 푼 코드
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left;
 *     public TreeNode right;
 *     public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
public class Solution {
    public int GetMinimumDifference(TreeNode root) {
        int min = int.MaxValue;
        void inorderTraverse(TreeNode root, int targetVal)
        {
            if(root == null) return ;
            
            if(root.val != targetVal) min = Math.Min(min, Math.Abs(targetVal - root.val));
            
            inorderTraverse(root.left, targetVal);
            inorderTraverse(root.right, targetVal);
            if(root.left != null) inorderTraverse(root.left, root.left.val);
            if(root.right != null) inorderTraverse(root.right, root.right.val);
        }
        inorderTraverse(root, root.val);
        return min;
    }
}Run 을 했을때 정답이기는 했으나 Submit 을 했을때 Time Error Exceeded 가 난 이유는 내가 BST 에 대한 이해가 없었고 그 특성을 전혀 고려하지않았기 때문이다.
Binary Search Tree (이진탐색트리) 즉 BST 의 특성은 아래와 같다. - 모든 노드에 대해, 왼쪽 서브트리의 모든 노드 값이 현재 노드의 값보다 작다. - 모든 노드에 대해, 오른쪽 서브트리의 모든 노드값이 현재 노드의 값보다 크다.
이 특성 때문에 이진탐색트리를 중위순회 (inorder traverse) 하면 오름차순으로 노드를 순회할 수 있다. 아래의 예시를 보자
    4
   / \
  2   6
 / \
1   3
위 BST 의 중위순회 순서는
1>2>3>4>6 이다.
BST 와 중위순회의 특성을 사용하면 한번의 순회만으로 노드간의 최소 값 차이를 구할 수 있는 것이다!
소감
BST 에서 중위순회 = 오름차순순회 임을 기억하자!
easy 이면서 내가 몰랐던 개념을 알 수 있어서 좋았다.
해결 코드
public class Solution {
    int min = int.MaxValue;
    TreeNode prev = null;
    public int GetMinimumDifference(TreeNode root) {
        
        inorderTraverse(root);
        return min;
    }
    void inorderTraverse(TreeNode node)
    {
        if(node == null) return;
        inorderTraverse(node.left);//left node
        if(prev != null)
        {
            min = Math.Min(min, node.val - prev.val );
        }
        prev = node;//current node
        inorderTraverse(node.right);//right node
    }
}Submission Detail

'알고리즘 > leetcode' 카테고리의 다른 글
| [Leetcode/C#] 637. Average of Levels in Binary Tree (0) | 2024.08.17 | 
|---|---|
| [LeetCode/C#] 374. Guess Number Higher or Lower (0) | 2024.05.04 | 
| [LeetCode/MSSQL] 262. Trips and Users (0) | 2024.04.06 | 
| [LeetCode/MSSQL] 1327. List the Products Ordered in a Period (1) | 2024.01.28 | 
| [LeetCode/MSSQL] 196. Delete Duplicate Emails (1) | 2024.01.28 | 
 
										
									 
										
									 
										
									 
										
									
댓글