代码随想录算法训练营第16天|513. 找树左下角的值、112. 路径总和、106.从中序与后序遍历序列构造二叉树

打卡Day16

  • 1.513. 找树左下角的值
  • 2.112. 路径总和
    • 扩展
      • 113. 路径总和 II
  • 3.106.从中序与后序遍历序列构造二叉树
    • 扩展
      • 105. 从前序与中序遍历序列构造二叉树
      • 从前序与后序遍历序列构造二叉树?

1.513. 找树左下角的值

题目链接:513. 找树左下角的值
文档讲解: 代码随想录

递归法:

class Solution(object):def findBottomLeftValue(self, root):""":type root: TreeNode:rtype: int"""self.res = None #不可以为0self.max_depth = float('-inf')self.traversal(root, 1)return self.resdef traversal(self, node, depth):if not node.left and not node.right:if depth > self.max_depth:self.max_depth = depthself.res = node.valreturnif node.left:self.traversal(node.left, depth + 1)#回溯#depth += 1#self.traversal(node.left, depth)#depth -= 1if node.right:self.traversal(node.right, depth + 1)

迭代法:

class Solution(object):def findBottomLeftValue(self, root):""":type root: TreeNode:rtype: int"""queue = collections.deque([root])levels = []while queue:level = []size = len(queue)for i in range(size): node = queue.popleft()level.append(node.val)if node.left:queue.append(node.left)if node.right:queue.append(node.right)levels.append(level)return levels[-1][0]
class Solution(object):def findBottomLeftValue(self, root):""":type root: TreeNode:rtype: int"""queue = collections.deque([root])res = 0while queue:size = len(queue)for i in range(size): node = queue.popleft()if i == 0:#我没想到res = node.valif node.left:queue.append(node.left)if node.right:queue.append(node.right)return res

2.112. 路径总和

题目链接:112. 路径总和
文档讲解: 代码随想录

class Solution(object):def hasPathSum(self, root, targetSum):""":type root: TreeNode:type targetSum: int:rtype: bool"""if not root:return Falsereturn self.traversal(root, targetSum - root.val)def traversal(self, node, count):if not node.left and not node.right and count == 0:return Trueif not node.left and not node.right:return Falseif node.left:count -= node.left.valif self.traversal(node.left, count):return Truecount += node.left.valif node.right:count -= node.right.valif self.traversal(node.right, count):return Truecount += node.right.valreturn False

精简版

class Solution(object):def hasPathSum(self, root, targetSum):""":type root: TreeNode:type targetSum: int:rtype: bool"""if not root:return Falseif not root.left and not root.right and targetSum == root.val:return Truereturn self.hasPathSum(root.left, targetSum - root.val) or self.hasPathSum(root.right, targetSum - root.val)

迭代法

class Solution(object):def hasPathSum(self, root, targetSum):""":type root: TreeNode:type targetSum: int:rtype: bool"""if not root:return Falsestack = [(root, root.val)]while stack:node, path_sum = stack.pop()if not node.left and not node.right and path_sum == targetSum:return Trueif node.right:stack.append((node.right, path_sum + node.right.val))if node.left:stack.append((node.left, path_sum + node.left.val))return False

扩展

113. 路径总和 II

题目链接:113

class Solution(object):def __init__(self):self.res = []self.path = []def pathSum(self, root, targetSum):""":type root: TreeNode:type targetSum: int:rtype: List[List[int]]"""if not root:return []self.path.append(root.val)self.traversal(root, targetSum - root.val)return self.resdef traversal(self, node, count):if not node.left and not node.right and count == 0:self.res.append(self.path[:])returnif not node.left and not node.right:returnif node.left:#要先把左子树的值保存self.path.append(node.left.val)count -= node.left.valself.traversal(node.left, count)count += node.left.val#路径也要回溯self.path.pop()if node.right:self.path.append(node.right.val)count -= node.right.valself.traversal(node.right, count)count += node.right.valself.path.pop()return
class Solution(object):def pathSum(self, root, targetSum):""":type root: TreeNode:type targetSum: int:rtype: List[List[int]]"""res = []if not root:return resself.traversal(root, targetSum, [], res)return resdef traversal(self, node, count, path, res):if not node:returnpath.append(node.val)count -= node.valif not node.left and not node.right and count == 0:res.append(list(path))self.traversal(node.left, count, path, res)self.traversal(node.right, count, path, res)path.pop()

迭代法

class Solution(object):def pathSum(self, root, targetSum):""":type root: TreeNode:type targetSum: int:rtype: List[List[int]]"""if not root:return []res = []stack = [(root, [root.val])] #元组的第二个元素的类型为list,方便求和while stack:node, path = stack.pop()if not node.left and not node.right and sum(path) == targetSum:res.append(path)if node.right:stack.append((node.right, path + [node.right.val]))if node.left:stack.append((node.left, path + [node.left.val]))return res

3.106.从中序与后序遍历序列构造二叉树

题目链接:106.从中序与后序遍历序列构造二叉树
文档讲解: 代码随想录

class Solution(object):def buildTree(self, inorder, postorder):""":type inorder: List[int]:type postorder: List[int]:rtype: TreeNode"""#判断树是否为空if not postorder:return None#后序遍历的最后一个当前的中间节点root_val = postorder[-1]root = TreeNode(root_val)#找切割点separator_index = inorder.index(root_val)#切割中序数组,得到前序数组的左右半边inorder_left = inorder[:separator_index]inorder_right = inorder[separator_index + 1:]#切割后序数组,得到后序数组的左右两边#中序数组的大小一定要和后序数组大小一样postorder_left = postorder[: len(inorder_left)]postorder_right = postorder[len(inorder_left):len(postorder) - 1]#递归root.left = self.buildTree(inorder_left, postorder_left)root.right = self.buildTree(inorder_right, postorder_right)return root

扩展

105. 从前序与中序遍历序列构造二叉树

题目链接:105

class Solution(object):def buildTree(self, preorder, inorder):""":type preorder: List[int]:type inorder: List[int]:rtype: TreeNode"""#终止条件if not preorder:return None#得到中间节点root_val = preorder[0]root = TreeNode(root_val)#找到切割点separator_index = inorder.index(root_val)#切割inorder_left = inorder[:separator_index]inorder_right = inorder[separator_index + 1:]preorder_left = preorder[1:len(inorder_left) + 1] #注意这里切割的终点要加1,因为是从preorder[1]开始的preorder_right = preorder[len(inorder_left) + 1:len(preorder)]#递归root.left = self.buildTree(preorder_left, inorder_left)root.right = self.buildTree(preorder_right, inorder_right)return root

从前序与后序遍历序列构造二叉树?

不可以,因为无法确定中间节点在哪里,不能唯一确定一棵二叉树。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/43870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

17.分频器设计拓展练习-任意分频通用模块

(1)Verilog代码: module divider_n(clk,reset_n,clk_out);input clk;input reset_n;output clk_out;wire clk_out1;wire clk_out2;wire [9:0]n;wire m;assign n 9;assign m n % 2;divider_even divider_even_inst(.clk(clk),.reset_n(reset_n),.n(n),.en(!m),.cl…

jQuery Mobile 实例:构建响应式移动网页的实践指南

jQuery Mobile 实例:构建响应式移动网页的实践指南 引言 在移动互联网时代,构建能够在各种设备上良好运行的网页应用至关重要。jQuery Mobile 是一个基于 jQuery 的轻量级移动框架,它允许开发者创建一个在智能手机、平板电脑和桌面电脑上均能流畅运行的响应式网站。本篇文…

【C++】一种优雅的枚举定义的代替技巧

枚举类型 比如,做事件触发系统。一般会用枚举类型,定义事件: enum {EventRoleLevelUp 1, // 玩家等级升级事件EventTaskComplete 2, // 任务完成事件 };在看 https://github.com/alecthomas/entityx 代码时,发现一种更为优…

QT程序异常结束解决方法

在用QT开发第三方SDK的时候,刚开始是运行正常的,但是重装系统之后再次运行程序总是出现:程序异常结束。 以下方法尝试无效,但不失为一种排查方法: 重新安装QT;检查Qt Creator配置,编译器位数和…

下载Windows版本的pycharm

Python环境搭建 第一步下载安装python 等待安装完成 验证python是否安装成功 Python开发工具安装部署 JetBrains: Essential tools for software developers and teams PyCharm: the Python IDE for data science and web development 下载社区版本的PyCharm 双击打开下载好的…

计算机视觉研究院 | 智慧工地:2PCNet,昼夜无监督域自适应目标检测(附原代码)

本文来源公众号“计算机视觉研究院”,仅用于学术分享,侵权删,干货满满。 原文链接:智慧工地:2PCNet,昼夜无监督域自适应目标检测(附原代码) 由于缺乏夜间图像注释,夜间…

C++:多态(继承)

hello,各位小伙伴,本篇文章跟大家一起学习《C:多态》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 ! 文章目录 :maple_leaf:多态的概念:maple_leaf:继承中的多态1.:leaves:虚函数表 :…

RedHat运维-Linux SSH基础1-介绍

1. 查看登录到当前系统上的所有用户的信息的命令是_____; 2. 查看登录到当前系统上的所有用户的信息的命令是_____; 3. 查看登录到当前系统上的所有用户的信息的命令是_____; 4. 查看登录到当前系统上的用户rhce的信息的命令是______________…

代码随想录算法训练营第四十八天| 115.不同的子序列、583. 两个字符串的删除操作、 72. 编辑距离

115.不同的子序列 题目链接:115.不同的子序列 文档讲解:代码随想录 状态:不会 思路: dp[i][j] 表示在 s 的前 j 个字符中,t 的前 i 个字符作为子序列出现的次数。 匹配的情况: 1.当 s[j-1] 与 t[i-1] 匹配…

接口测试(3)

接口自动化 # 获取图片验证码import requestsresponse requests.get(url"http://kdtx-test.itheima.net/api/captchaImage")print(response.status_code) print(response.text) import requestsurl "http://kdtx-test.itheima.net/api/login" header_da…

计算机网络之WPAN 和 WLAN

上一篇文章内容:无线局域网 1.WPAN(无线个人区域网) WPAN 是以个人为中心来使用的无线个人区域网,它实际上就是一个低功率、小范围、低速率和低价格的电缆替代技术。 (1) 蓝牙系统(Bluetooth) &#…

常见的Java注解类

Java 注解类大多是在 java.lang.annotation 包中定义的。这个包包括了定义注解和元注解的核心类和接口。Java 注解类主要包括几种核心注解和用于定义注解的元注解。以下是一些常见的 Java 注解类: 核心注解类 @Override 用于标识方法重写。编译器会检查方法是否正确地重写了超…

项目构思及ER图

构思: 首先是登录界面,我们首先绘制一个界面,在界面里面存储两个文本框,用于读取用户输入的文本,然后由客户端传到服务器里面和数据库进行对比,如果密码和账号对应的时候就可以进入到qq的主界面 注册&…

QT文件生成可执行的exe程序

将qt项目生成可执行的exe程序可按照以下步骤进行: 1、在qt中构建运行生成.exe文件; 2、从自定义的路径中取出exe文件放在一个单独的空文件夹中(exe文件在该文件夹中的release文件夹中); 3、从开始程序中搜索qt&#xf…

CTF php RCE(二)

0x04 php伪协议 这种我们是先看到了include才会想到,利用伪协议来外带文件内容,但是有些同学会问,我们怎么知道文件名是哪个,哪个文件名才是正确的,那么这里我们就得靠猜了 include函数 因为 include 是一个特殊的语…

R语言学习笔记3-基本类型篇

R语言学习笔记-基本类型篇 基本类型介绍数值型(Numeric)整数型(Integer)浮点数型(Double)数值运算数值型 NA(缺失值) 字符型(Character)字符型的特点和用途基…

产品原型设计:从概念到实现的完整指南

如果你是一位产品经理,那么你一定会和原型图打交道,产品原型是产品设计方案和底层逻辑的可视化表达,需要完整清晰地表达出产品目的及需求,在整个产品创造的过程中发挥着不可或缺的作用。而对于一些刚入行的产品经理来说&#xff0…

Instruct-GS2GS:通过用户指令编辑 GS 三维场景

Paper: Instruct-GS2GS: Editing 3D Gaussian Splats with Instructions Introduction: https://instruct-gs2gs.github.io/ Code: https://github.com/cvachha/instruct-gs2gs Instruct-GS2GS 复用了 Instruct-NeRF2NeRF 1 的架构,将基于 NeRF 的三维场景编辑方法迁…

4:表单和通用视图

表单和通用视图 1、编写一个简单的表单&#xff08;1&#xff09;更新polls/detail.html文件 使其包含一个html < form > 元素&#xff08;2&#xff09;创建一个Django视图来处理提交的数据&#xff08;3&#xff09;当有人对 Question 进行投票后&#xff0c;vote()视图…

工具推荐:滴答清单

官网地址&#xff1a;DIDA:Todo list, checklist and task manager app for Android, iPhone and Web 使用近一个月&#xff0c;特别方便&#xff0c;使用感受非常棒&#xff0c;功能全面。 我主要用了以下功能&#xff1a; 1、每日事项提醒&#xff1a;写作&#xff0c;背字…