- νΈλ¦¬μ νΉμ μ§μ μμ κ°μΌμ΄ μμλμ΄ νΈλ¦¬ μ μ²΄λ‘ νΌμ Έλκ°λ μκ°μ ꡬνλ€.
- μμ μμ
0
μ ν΄λΉ μ§μ μ΄ μ΄λ―Έ κ°μΌλ μνμ΄λ€. - λ§€ μκ°
1
λ§λ€ μΈμ ν λ
Έλκ° κ°μΌλλ€.
- λ¬Έμ λ₯Ό νλ§λλ‘ μμ½νλ©΄ νΈλ¦¬μ νΉμ μ§μ μ rootλ‘ νμ¬ leaf λ
Έλλ‘ λλ¬νλ μ΅λ κΉμ΄λ₯Ό ꡬνλ κ²μ΄λ€.
- νΈλ¦¬μ νΉμ μ§μ μ rootλ‘ λ°κΎΈμ΄μΌ νκΈ°μ νΈλ¦¬λ₯Ό κ·Έλνλ‘ λ³ν (λλ νΈλ¦¬λ₯Ό μ¬κ΅¬μ±)νμ¬ νμ΄μΌ νλ€.
- μ΄λ κ² νλ €λ©΄ μΆκ°μ μΌλ‘ λ©λͺ¨λ¦¬ 곡κ°μ΄ νμνλ€.
- νμ§λ§ μνκ°μ μ΄μ©νμ¬ νΈλ λ°©λ²λ μλ€.
- νμ¬ λ
Έλλ₯Ό ν¬ν¨νμ¬ κ²½λ‘μ μ΅λ κΈΈμ΄λ₯Ό ꡬνλ€ λ§μ§λ§μ
-1
μ νμ¬ κ²°κ³Όλ₯Ό λμΆν΄λΈλ€. - μμμ μ μ΄λ―Έ κ°μΌ λμκΈ° λλ¬Έμ μκ°μμ
1
μ λΉΌμΌ νλ€.
- νΈλ¦¬λ₯Ό μνν λ λ§€ λ¨κ³λ§λ€ λ κ°μ λμΆν΄λΈλ€.
- κ°1: νμ¬ νΈλ¦¬μμ ꡬν μ μλ μ΅λ κ²½λ‘μ κΈΈμ΄
- κ°2: κ°μΌ μμμ μμ νμ¬ μ§μ κΉμ§μ 거리 (κ°μΌ μμμ μ ν¬ν¨νλ©°, κ°μΌμ΄ μμΌλ©΄ 0μ΄ λλ€)
- μνλ λ€μκ³Ό κ°μ΄ μ΄λ£¨μ΄μ§λ€.
- μΌμͺ½, μ€λ₯Έμͺ½ κ°κ°μ μννμ¬ κ²°κ³Όκ°
left
, right
μ λμΆν΄λΈλ€. - μμͺ½ λͺ¨λ κ°μΌμ΄ μλ€λ©΄
- κ°1: μμͺ½ νΈλ¦¬ μ€ μ΅λ κΉμ΄ κ°
max(left.getKey(), right.getKey())
μ ꡬνλ€ 1μ λνλ€ - κ°2: νμ¬ λ
Έλκ° κ°μΌ μμμ μ΄λΌλ©΄
1
, μλλΌλ©΄ 0
μ λλ €μ€λ€
- μΌμͺ½, μ€λ₯Έμͺ½ μ€ μ΄λ νμͺ½μ΄ κ°μΌλμλ€λ©΄
- κ°μΌλ μͺ½μ
A
, κ°μΌλμ§ μμ μͺ½μ B
λΌκ³ ν λ - κ°1
A
μͺ½μ κΉμ΄λ κ²°κ³Όκ° A.getKey()
κ·Έλλ‘κ° λλ€. - λ°λ©΄
B
μͺ½μ κ°μΌ μμμ ~ νμ¬ λ
ΈλκΉμ§μ 거리 + B
μͺ½μ νΈλ¦¬ κΉμ΄κ° κ°μΌ κ±°λ¦¬κ° λλ―λ‘ μ΅μ’
κΉμ΄ κ°μ (B.getKey() + 1) + A.getValue()
κ° λλ€. - λ κ° μ€μ ν° κ°μ κ²°κ³Όλ‘ νλ€.
- κ°2
A
μͺ½μ κ°μΌ 거리μ 1μ λνλ€ (μ΄μ νμ¬ νΈλ¦¬κ° κ°μΌλ νΈλ¦¬κ° λλ€).
/**
* 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 {
static final Pair<Integer, Integer> ZERO = new Pair<Integer, Integer>(0, 0);
Pair<Integer, Integer> traverse(TreeNode node, int start) {
Pair<Integer, Integer> left = node.left != null?
traverse(node.left, start) : ZERO;
Pair<Integer, Integer> right = node.right != null?
traverse(node.right, start) : ZERO;
if (left.getValue() == 0 && right.getValue() == 0) {
int depth = Math.max(left.getKey(), right.getKey()) + 1;
return new Pair(depth, node.val == start? 1 : 0);
} else if (left.getValue() != 0) {
return new Pair(
Math.max(left.getKey(), right.getKey() + 1 + left.getValue()),
left.getValue() + 1
);
} else {
int x = Math.max(right.getKey() + 1, left.getKey() + right.getValue());
return new Pair(
Math.max(right.getKey(), left.getKey() + 1 + right.getValue()),
right.getValue() + 1
);
}
}
public int amountOfTime(TreeNode root, int start) {
Pair<Integer, Integer> result = traverse(root, start);
return result.getKey() - 1;
}
}