Given an undirected tree consisting of n vertices numbered from 0 to n-1, which has some apples in their vertices. You spend 1 second to walk over one edge of the tree. Return the minimum time in seconds you have to spend to collect all apples in the tree, starting at vertex 0 and coming back to this vertex.

The edges of the undirected tree are given in the array edges, where edges[i] = [ai, bi] means that exists an edge connecting the vertices ai and bi. Additionally, there is a boolean array hasApple, where hasApple[i] = true means that vertex i has an apple; otherwise, it does not have any apple.

Input: n = 7, edges = [[0,1],[0,2],[1,4],[1,5],[2,3],[2,6]], hasApple = [false,false,true,false,true,true,false]
Output: 8 
Explanation: The figure above represents the given tree where red vertices have an apple. One optimal path to collect all apples is shown by the green arrows.  

Solution

/**
 * @param {number} _n
 * @param {number[][]} edges
 * @param {boolean[]} hasApple
 * @return {number}
 */

let n = 7,
  edges = [
    [0, 1],
    [0, 2],
    [1, 4],
    [1, 5],
    [2, 3],
    [2, 6],
  ];

let hasApple = [false, false, true, false, true, true, false];

var minTime = function (_n, edges, hasApple) {
  let n = _n;
  let graph = new Array(n).fill(0).map(() => new Array());
  for (let [u, v] of edges) {
    graph[u].push(v);
    graph[v].push(u);
  }
  let seen = new Array(n).fill(false);
  let ans = 0;
  const dfs = (u) => {
    seen[u] = true;
    let ret = false;
    for (let v of graph[u]) {
      if (seen[v]) continue;
      if (dfs(v)) {
        ans += 2;
        ret = true;
      }
    }
    return ret || hasApple[u];
  };
  dfs(0);
  return ans;
};

This one was confusing to me at first, this video (solving it with Python) helped me understand the problem better: Minimum Time to Collect All Apples in a Tree - Leetcode 1443 - Python By NeetCodeIO