이진 트리에서 두 값을 뺀 절대값이 최대가 되도록 하는 문제다. 단, 여기서 두 값은 부모와 자식의 관계로 이루어져야 한다.
최대값과 최소값을 구해서 빼주면 된다고 생각지만, 단순히 전체 탐색만을 적용할 경우 최대값과 최소값이 부모 자식의 관계가 아닐 수 있다.
이 부분을 해결하지 못해서 결국 솔루션을 확인했다.
솔루션에서는 left와 rigth로 나눠서 각 방향 별로 구한 최대값과 최소값을 구해 빼주도록 했다. 그리고 left와 right를 서로 비교하는 식이다. 이렇게 하면 두 노드 간에 관계가 부모와 자식을 유지할 수 있다.
/**
* 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 int maxAncestorDiff(TreeNode root) {
if(root == null){
return 0;
}
return DFS(root, root.val, root.val);
}
public int DFS(TreeNode node, int max, int min){
if(node == null){
return Math.abs(max - min);
}
if(max < node.val){
max = node.val;
}
if(min > node.val){
min = node.val;
}
int left = DFS(node.left, max, min);
int right = DFS(node.right, max, min);
return Math.max(left, right);
}
}
DFS와 BFS 등 알고리즘의 기본을 알고 있어도 언제나 2%가 부족한 느낌.
https://leetcode.com/problems/maximum-difference-between-node-and-ancestor/description/