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);
}
上のコードの終了条件を見てください.探索可能なノードがなく、
target
がnode.val
の値に等しい場合、これが答えの条件であるため、result
配列にpath
を入れる.これにより、再帰関数が最後に終了すると、
result
配列に正しい値が与えられる.質問リンク
https://leetcode.com/problems/path-sum-ii/
LeetCode GitHub
https://github.com/tTab1204/LeetCode
Reference
この問題について(113. Path Sum II), 我々は、より多くの情報をここで見つけました https://velog.io/@ken1204/113.-Path-Sum-IIテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol