Проблема

Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum.
Note: A leaf is a node with no children.
Example:
Given the below binary tree and sum = 22,
5
     / \
    4   8
   /   / \
  11  13  4
 /  \    / \
7    2  5   1

Возвращение:

[
   [5,4,11,2],
   [5,8,4,5]
]

Решение:

*Давайте создадим массив, в котором будут храниться все возможности дерева, где сумма значений корневого узла и конечного узла равна сумме.
* мы вызываем функцию, где параметром являются узел, массив, текущая сумма
* при первом вызове текущий узел является корневым, массив представляет собой пустой массив (чтобы поместить все значения узлов от корня к листу) и текущая сумма = 0.
* текущая сумма будет суммой от корня => листа.
* мы проверяем, является ли сумма листьев (то есть сумма от корня до листьев) ‹= суммой для сравнения.
*
* Если это так, то мы проверяем, есть ли левый или правый узел. если есть, то мы рекурсивно вызываем функцию с узлом в качестве текущего node.left и более поздним текущим node.right .
* мы возвращаемся из функции, когда левый и правый узлы текущего узла равны нулю.
* когда мы возвращаемся из функции, мы извлекаем значение последнего переданного значения левого или правого узла, чтобы остальная часть пройденного узла сохраняется.
*
* Если сумма равна leafsum и если нет левого и правого узлов, то мы создаем отдельную копию текущего пройденного массива и вставляем в окончательный возвращаемый массив.
*
* После обхода всех узлов мы возвращаем окончательный возвращаемый массив, который содержит массив возможных комбинаций узлов, сумма которых от корня до листа равна сумме.

Псевдокод

step 1: initial an empty return array
step 2: call the function where the parameters are root node, empty array , current sum = 0 .
step 3: inside the function. 
     a. check if the node exist .
     b. True: 
         i: Add the current node value to the current sum 
         ii: check if node.left or node.right exist
         iii: True
            * Traverse to Left/right most node First 
            * Repeat step a.
         iv: False
            * check the sum == current sum . 
               True: push the current array to return array
          v. Pop the last push value from the array.
          vi: repeat ii until all the nodes values are read.
step 4: Return the return array.

Код:

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} sum
 * @return {number[][]}
 */
var pathSum = function(root, sum) {
     
    var finalArray=[];
    function FindRootToLeaf(node,arr,leafSum){
        if(node){
            leafSum+=node.val;
            arr.push(node.val);
            // console.log(arr, leafSum); 
// //             check if the current leaf sum is less than or equal to sum . if its greater then we neednot traverse futher down the tree.
//             if(leafSum <= sum){
              if(node.left || node.right){
                if(node.left){
                FindRootToLeaf(node.left,arr,leafSum);
                arr.pop();
                } if(node.right){
                FindRootToLeaf(node.right,arr,leafSum);
                arr.pop();
                } 
            }else{
              if(sum == leafSum){
                // console.log(arr);
//        creating a new temp array,helps to avoid the reference array problem.
//                   if we dont create a new copy, every time when the arr changes, the value in final array also changes as we are pushing the reference array of arr.
                  var temp = arr.map(elem => elem);
                finalArray.push(temp);  
                }  
            }   
        }  
    }
    FindRootToLeaf(root,[],0);
    // console.log('finalArray '+ finalArray);
    return finalArray;
};