这道题原来可以用到JS这么多知识点!

简介: 这道题原来可以用到JS这么多知识点!这几天刷到一道算法题,发它对我们的基础考查挺大,不仅是算法基础,还有语言的基础,其运行机制这些,下面我们来看看这道题。可以转载,但请声明源链接:文章源链接justin3go.com(有些latex公式某些平台不能渲染可查看这个网站)

这道题原来可以用到JS这么多知识点!

这几天刷到一道算法题,发它对我们的基础考查挺大,不仅是算法基础,还有语言的基础,其运行机制这些,下面我们来看看这道题。

可以转载,但请声明源链接:文章源链接justin3go.com(有些latex公式某些平台不能渲染可查看这个网站)

JZ34 二叉树中和为某一值的路径(二)



题目描述

输入一颗二叉树的根节点root和一个整数expectNumber,找出二叉树中结点值的和为expectNumber的所有路径。

  1. 该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点
  2. 叶子节点是指没有子节点的节点
  3. 路径只能从父节点到子节点,不能从子节点到父节点
  4. 总节点数目为n


输入:{10,5,12,4,7},22
返回值:[[10,5,7],[10,12]]
说明:返回[[10,12],[10,5,7]]也是对的   


function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
}


我的解法

在解这道题时,题目中有两点值得注意:

  • 要求的是根到叶子节点
  • 和为给定数

显然,这是一道深度优先遍历出所有满足条件的路径

这里,我使用了cur来存储当前的累加和,使用了arr来存储当前的路径信息;

这两个的区别就是我们今天的重点:

  • cur为值变量,它是保存在栈之中的,作为参数传入函数中,函数修改了该值也不会对当前作用域的cur造成影响;


{
  let cur = 0;
  ((cur)=>{cur = 1})(cur);
  console.log(cur);  // 1;
}


  • arr作为引用变量,它是保存在堆里面,作为参数传入函数中时,它是传入的指针,所以修改的值也会影响到所有指向该对象的指针,这个对象此时只有一个;
{
  const arr = [1,2,3];
  ((arr)=>{arr.push(4)})(arr);
  console.log(arr);  // [ 1, 2, 3, 4 ]
}


所以我们要想arr在函数中修改不会影响到外部作用域,可以将其复制,然后再传入函数中,这时候对象就有两个了;

{
  const arr = [1,2,3];
  ((arr)=>{arr.push(4)})([...arr]);  // 这里使用ES6的语法进行复制
  console.log(arr);  // [ 1, 2, 3 ]
}


然后我们将其结合递归,递归其实也是内部有一个自己的函数,然后就是需要注意一下结束条件是如何返回的,下面就是该题的解法,该注释都注释了,如有问题请在评论区提出:

// 题解
function FindPath(root, expectNumber){
  let res = [];  // 存储符合该题条件的路径
  (function Dfs(root, cur, arr){
    if(!root) return;  // root为空时
    cur += root.val;  // 加上当前节点的值
    arr.push(root.val);  // 保存当前节点
    if(!root.left && !root.right && cur === expectNumber){
      res.push(arr);  // 符合条件的路径
    }
    Dfs(root.left, cur, [...arr]);  // 遍历左子树
    Dfs(root.right, cur, [...arr]); // 遍历右子树
  })(root, 0, []);
  return res;
}


当存储函数栈帧时,cur和arr会在之前的情况下添加节点,当弹出栈帧时,cur和arr会在之前的情况减少一个节点,因为返回到上一作用域了。

\

目录
相关文章
|
JavaScript 前端开发 API
|
JavaScript 前端开发 CDN
总结 vue3 的一些知识点:Vue.js 安装
总结 vue3 的一些知识点:Vue.js 安装
|
JavaScript
总结 vue3 的一些知识点:​Vue.js 条件语句​
总结 vue3 的一些知识点:​Vue.js 条件语句​
|
6月前
|
设计模式 JavaScript 前端开发
JavaScript进阶挑战:巩固核心知识点
以上内容涵盖了从基础到进阶水平所需掌握内容,在日常工作中需要持续实践和深入学习才能真正精通这些知译点。
229 12
|
12月前
|
存储 前端开发 JavaScript
JavaScript的重要知识点
以上就是JavaScript的一些重要知识点。学习JavaScript需要理解和掌握这些知识点,才能编写出高效、可维护的代码。同时,还需要不断实践,通过编写项目来提高编程技能。
219 14
|
存储 JavaScript 前端开发
JS的ES6知识点
【10月更文挑战第19天】这只是 ES6 的一些主要知识点,ES6 还带来了许多其他的特性和改进,这些特性使得 JavaScript 更加现代化和强大,为开发者提供了更多的便利和灵活性。
512 157
|
JavaScript 前端开发 Java
JavaScript 类知识点概览
概览JavaScript中类的知识点,包括类的定义和实现、添加方法和get/set方法、类的继承和静态方法的使用。通过学生类和人员类的例子,演示了类的构造器、方法定义、继承关系和静态方法的调用。
JavaScript 类知识点概览
|
JavaScript 前端开发 Java
【javaScript数组,函数】的基础知识点
【javaScript数组,函数】的基础知识点
164 5
|
存储 JSON JavaScript
JS知识点
JS知识点
200 3
|
JavaScript 前端开发
JavaScript 知识点总结
JavaScript 知识点总结JavaScript 是一种广泛应用于前端开发的编程语言。本文将总结一些常见的 JavaScript 知识点,帮助你更好地理解和应用这门语言。 一、基本语法和数据类型 变量声明:使用 var、let 或 const 声明变量。var 声明的变量具有函数作用域,而 let 和 const 声明的变量具有块级作用域。 var x = 10; let y = 20; const z = 30; 数据类型:JavaScript 中有以下几种基本数据类型:String(字符串)、Number(数字)、Boolean(布尔值)、Undefined(未定义)、Null(空值
202 3

热门文章

最新文章

下一篇
开通oss服务