113. Path Sum II


💡 に答える

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} targetSum
 * @return {number[][]}
 */
var pathSum = function (root, targetSum) {
  if (!root) return [];
  let result = [];
  const recurPathSum = (node, target, path) => {
    if (!node.left && !node.right && target === node.val) {
      // console.log('path: ', path);
      result.push(path);
    }

    if (node.left)
      recurPathSum(node.left, target - node.val, [...path, node.left.val]);
    if (node.right)
      recurPathSum(node.right, target - node.val, [...path, node.right.val]);
  };
  recurPathSum(root, targetSum, [root.val]);
  return result;
};
let root = [5, 4, 8, 11, null, 13, 4, 7, 2, null, null, 5, 1];
let targetSum = 22;

pathSum(root, targetSum);

📝 整理する


  • 木探索問題の基本問題だそうです.問題の要件は、下図に示すノードvalueの値の和がtargetSumに一致する配列順にreturnを行うことである.


  • この問題はまずツリー検索に対する理解が必要である.ルートノードから探索することが基本条件である.コードを見てください.
  • if (!root) return [];
    let result = [];
  • root配列に何もない場合、コードは空の配列returnになります.これは例外処理です.

  • 結果値を含むresult配列を生成します.
  • // 맨 아래 라인
    recurPathSum(root, targetSum, [root.val]);
  • 私は再帰探索で問題を解いた.したがって、関数が最初に呼び出されると、パラメータに入る値が指定されます.root, targetSum, [root.val]ここでroot.valは、ノードのvalueの値である.root配列の元素値を意味します.( = 5, 4, 8... )
  • const recurPathSum = (node, target, path) => {
        if (!node.left && !node.right && target === node.val) {
          // console.log('path: ', path);
          result.push(path);
        }
    
        if (node.left)
          recurPathSum(node.left, target - node.val, [...path, node.left.val]);
        if (node.right)
          recurPathSum(node.right, target - node.val, [...path, node.right.val]);
      };
  • は現在、再帰関数部分です.次のコードから見ます.
  •   if (node.left)
          recurPathSum(node.left, target - node.val, [...path, node.left.val]);
      if (node.right)
          recurPathSum(node.right, target - node.val, [...path, node.right.val]);

  • これは再帰探索の部分である.第1条件文if(node.left)は、ノードの左側に値がある場合に、recurPathSum関数を再び呼び出す.

  • 最後のパラメータである[...path, node.left.val]は配列であり、これまでのpathで回答する値を格納している....pathのように、電子演算子によってスタックされ続けます.

  • 2番目の条件文は、ノードの右側に値がある場合にrecurPathSUm関数を呼び出す.動作は同じです.
  •   if (!node.left && !node.right && target === node.val) {
          // console.log('path: ', path);
          result.push(path);
        }

  • 上のコードの終了条件を見てください.探索可能なノードがなく、targetnode.valの値に等しい場合、これが答えの条件であるため、result配列にpathを入れる.

  • これにより、再帰関数が最後に終了すると、result配列に正しい値が与えられる.
  • 修正、指摘を歓迎します!

    質問リンク


    https://leetcode.com/problems/path-sum-ii/

    LeetCode GitHub


    https://github.com/tTab1204/LeetCode