一天一大 lee(左叶子之和)难度:简单-Day20200919
时间:2022-07-25
本文章向大家介绍一天一大 lee(左叶子之和)难度:简单-Day20200919,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目:[1]
计算给定二叉树的所有左叶子之和。
示例:
3
/
9 20
/
15 7
在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
抛砖引玉
抛砖引玉
二叉树遍历,首先想到的有两种遍历方式深度优先搜索(DFS)、广度优先搜索(BFS)
剩下的问题就是在遍历中找出哪些节点是左叶子节点了:
- 叶子结点:没有下一层(即该节点之后没有left和right)
- 左叶子结点:节点上一次被其他节点(设为node)left连接
那么在判断出左叶子节点的逻辑应该在node那一层就完成(因为二叉树是没有办法回溯到上一个节点的)
满足下面两个条件说明就是左叶子节点,传入节点node:
- node的左节点,其left和right均为null
深度优先搜索(DFS)
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
var sumOfLeftLeaves = function(root) {
let _result = 0;
if(root === null) return _result;
function dfs(node){
// 终止条件,遇到叶子结点
if(node === null) return
let left = node.left,
right = node.right
// node的左节点,其left和right均为null
if(left != null &&left.left == null && left.right == null){
_result = _result + left.val
}
// 继续遍历子树
dfs(left)
dfs(right)
}
dfs(root)
return _result
};
优化:
在上面的逻辑中,发现有的递归时可以省略的,也没有利用起来递归的返回值:
- 已经查到了node子树的左叶子节点,node的left子树还是要参与下一层递归
- 可以不声明结果变量然后向其累加,可以利用递归返回值累加
var sumOfLeftLeaves = function (root) {
if (!root) return 0
if (isLeaf(root.left)) {
// 是左叶子节点则相加
return root.left.val + sumOfLeftLeaves(root.right)
}
// 不是点则再往下查
return sumOfLeftLeaves(root.left) + sumOfLeftLeaves(root.right)
};
function isLeaf(node) {
// 判断此节点存在
if (node === null) return false
// 判断此节点是否为叶子节点
return node.left === null && node.right === null
}
广度优先搜索(BFS)
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
var sumOfLeftLeaves = function(root) {
let _result = 0,
quene = [root];
if(root === null) return _result;
while(quene.length){
let node = quene.shift()
// 终止条件,遇到叶子结点
if(node === null) continue
let left = node.left;
// node的左节点,其left和right均为null
if(left != null &&left.left === null && left.right === null){
_result = _result + left.val
}
// 子树继续入栈待遍历
quene.push(left)
quene.push(node.right)
}
return _result
};
- 腾讯云Fintech云端系列论坛首站北京,揭秘如何全链路赋能互联网金融
- Flask入门笔记(一)
- 刷脸还是指纹识别,that's a question
- c#:使用using关键字自动释放资源未必一定就会有明显好处
- MongoDB 学习笔记(原创)
- Silverlight:ScorllViewer随Tab键自动跟随子控件的Focus滚动
- 老域名做新站如何能快速得上首页?
- Silverlight:分包下载及SEO优化方案
- jQuery调用RESTful WCF示例(GET方法/POST方法)
- "RDLC"报表-参数传递及主从报表
- 初探小程序之运营及未来方向
- 微信小程序深夜开放NFC等连接能力,未来可直接刷公交?
- Silverlight:获取ContentTemplate中的命名控件
- silverlight向wcf传递大于8192字节(8k)的字符串
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- SAP Spartacus和product相关的标准normalizer
- 【Rust 日报】2020-09-09 引入“auditable”
- 听说MongoDB你很豪横?-------------MongoDB复制集以及管理优化
- 听说Memcache你很豪横?-------------深入剖析Memcache 安装及管理数据库操作
- 听说Memcache你很豪横?-------------深入剖析Memcache+keepalive高可用群集
- 排障集锦:九九八十一难之第十四难!------------- 安装magent时make编译报错
- 【Rust日报】2020-09-06 Evil_DLL 用来测试注入方法的DLL
- 【Rust日报】2020-09-05 微软在c++静态分析工具实现了一些rust的安全规则
- 一起来玩玩WebGL
- 自研网关:多项目的swagger聚合功能
- Prometheus 如何做到“活学活用”,大牛总结的避坑指南
- 文档驱动 —— 表单组件(一):表单元素组件 优点缺点选择文本类的Inputcheck 多选value的类型问题
- Vue3.0源码结构分析
- 【每周一库】- cached - 缓存结构型、辅助函数记忆化
- meta生成器 —— 表单元素组件 meta表单代码meta的模板data变幻