From 407c08457cadf94df46b16bf17231f2fa6d9ec82 Mon Sep 17 00:00:00 2001 From: mengyuan Date: Mon, 22 Nov 2021 20:18:58 +0800 Subject: [PATCH] =?UTF-8?q?update:=20112.=20=E8=B7=AF=E5=BE=84=E6=80=BB?= =?UTF-8?q?=E5=92=8C=20&&=20=E8=B7=AF=E5=BE=84=E6=80=BB=E5=92=8C-ii=20js?= =?UTF-8?q?=E8=BF=AD=E4=BB=A3=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0112.路径总和.md | 67 ++++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/problems/0112.路径总和.md b/problems/0112.路径总和.md index 054b2340..19f4bcac 100644 --- a/problems/0112.路径总和.md +++ b/problems/0112.路径总和.md @@ -614,6 +614,7 @@ func haspathsum(root *treenode,sumnodes *[]int,targetsum int,result *[][]int){ 0112.路径总和 +**递归** ```javascript /** * @param {treenode} root @@ -643,9 +644,38 @@ let haspathsum = function (root, targetsum) { // return haspathsum(root.left, targetsum - root.val) || haspathsum(root.right, targetsum - root.val); }; ``` +**迭代** +```javascript +let hasPathSum = function(root, targetSum) { + if(root === null) return false; + let nodeArr = [root]; + let valArr = [0]; + while(nodeArr.length) { + let curNode = nodeArr.shift(); + let curVal = valArr.shift(); + curVal += curNode.val; + // 为叶子结点,且和等于目标数,返回true + if (curNode.left === null && curNode.right === null && curVal === targetSum) { + return true; + } + // 左节点,将当前的数值也对应记录下来 + if (curNode.left) { + nodeArr.push(curNode.left); + valArr.push(curVal); + } + // 右节点,将当前的数值也对应记录下来 + if (curNode.right) { + nodeArr.push(curNode.right); + valArr.push(curVal); + } + } + return false; +}; +``` 0113.路径总和-ii +**递归** ```javascript let pathsum = function (root, targetsum) { // 递归法 @@ -677,7 +707,7 @@ let pathsum = function (root, targetsum) { return res; }; ``` -113 路径总和 精简版 +**递归 精简版** ```javascript var pathsum = function(root, targetsum) { //递归方法 @@ -701,6 +731,41 @@ var pathsum = function(root, targetsum) { return resPath; }; ``` +**迭代** +```javascript +let pathSum = function(root, targetSum) { + if(root === null) return []; + let nodeArr = [root]; + let resArr = []; // 记录符合目标和的返回路径 + let tempArr = [[]]; // 对应路径 + let countArr = [0]; //对应和 + while(nodeArr.length) { + let curNode = nodeArr.shift(); + let curVal = countArr.shift(); + let curNodeArr = tempArr.shift(); + curVal += curNode.val; + curNodeArr.push(curNode.val); + // 为叶子结点,且和等于目标数,将此次结果数组push进返回数组中 + if (curNode.left === null && curNode.right === null && curVal === targetSum) { + resArr.push(curNodeArr); + } + // 左节点,将当前的和及对应路径也对应记录下来 + if (curNode.left) { + nodeArr.push(curNode.left); + countArr.push(curVal); + tempArr.push([...curNodeArr]); + } + // 右节点,将当前的和及对应路径也对应记录下来 + if (curNode.right) { + nodeArr.push(curNode.right); + countArr.push(curVal); + tempArr.push([...curNodeArr]); + } + } + return resArr; +}; +``` +