代码随想录27期|Python|Day17|二叉树|110.平衡二叉树 |257. 二叉树的所有路径 |404.左叶子之和

110. 平衡二叉树 - 力扣(LeetCode)

在递归后序遍历的基础上加上一个中间节点判断左右子节点的高度的步骤即可。

具体实现

是如果左右子树已经高度差大于1,则中间节点标记为-1,在逐层向上返回之后可以在root节点被判定为false;如果小于等于1,则保留左右节点高度较大的值+1作为当前中间节点的高度

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):def isBalanced(self, root):""":type root: TreeNode:rtype: bool"""return False if self.getHeight(root) == -1 else Truedef getHeight(self, node):if not node:return 0# 取左高度left_height = self.getHeight(node.left)if left_height == -1:  # 如果已经是被标记过为-1,返回-1return -1# 取右高度right_height = self.getHeight(node.right)if right_height == -1:return -1# 中间节点处理if abs(right_height - left_height) > 1:res = - 1  # 高度差大于1,返回-1else:res = max(right_height, left_height) + 1  # 其余情况返回最大值作为当前节点的高度return res

257. 二叉树的所有路径 - 力扣(LeetCode)

首先确定遍历顺序,由于输出的结果是(root--leaf)的格式,显然使用前序遍历可以保存从中间节点开始的遍历顺序。

然后确定递归方法。这里在一般的中序遍历基础上考虑回溯(也就是在添加一个新的节点或由该节点引发的路径之后,需要在路径探索完毕后从叶子节点依次弹出路径记录的节点)。(图:代码随想录)

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):def binaryTreePaths(self, root):""":type root: TreeNode:rtype: List[str]"""path = []  # 路径用来保存走过的路径,也是主要回溯的对象res =[]  # 结果用来保存输出的内容,是字符串组成的数组if not root:return resself.traversal(root, path, res)return resdef traversal(self, node, path, res):path.append(node.val)  # 先保存传入节点的值# Step 1:确定终止条件。(中)# 当前节点的左右子节点都是空的时候,说明当前节点是叶子节点。按照格式保存if not node.left and not node.right:Str_path = '->'.join(map(str, path))res.append(Str_path)return  # return到上一级的节点所在的函数体# Step 2:左节点处理if node.left:self.traversal(node.left, path, res)path.pop()  # 在上一个函数执行完之后回溯,也就是从path中弹出刚刚加入的新节点# Step 3:右节点处理if node.right:self.traversal(node.right, path, res)path.pop()

本题也可以使用迭代算法+栈解决。

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):def binaryTreePaths(self, root):""":type root: TreeNode:rtype: List[str]"""# 迭代# 创建:结果,字符串路径,节点栈res, str_path, stack = [], [str(root.val)], [root]while stack:# 每次stack弹出一个节点cur = stack.pop()path = str_path.pop()if not cur.left and not cur.right:res.append(path)if cur.left:stack.append(cur.left)str_path.append(path + '->' + str(cur.left.val))if cur.right:stack.append(cur.right)str_path.append(path + '->' + str(cur.right.val))return res

404. 左叶子之和 - 力扣(LeetCode)

判断当前节点是否是左叶子节点必须依赖其父节点和其左右子节点空来判断。

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):def sumOfLeftLeaves(self, root):""":type root: TreeNode:rtype: int"""# 先判断是否是空节点if not root:return 0# 在判断是否左右节点都是空,这样是没有左节点的if not root.left and not root.right:return 0left_value = self.sumOfLeftLeaves(root.left)# 需要同时满足:1.是父节点的左子节点;2.左右孩子节点都是空if root.left and not root.left.left and not root.left.right:left_value = root.left.valright_value = self.sumOfLeftLeaves(root.right)return left_value + right_value

第17天结束OMGGGGGG🎉

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

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

相关文章

力扣---最长回文子串(动态规划)

目录 ​编辑 题目 思路步骤: 代码 我的其他博客 题目 给你一个字符串 s,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。 示例 1: 输入:s "babad" 输出&…

详解git pull和git fetch的区别

git pull和git fetch的区别, 网上人云亦云胡说八道的实在是太多了,误导我很久。 今天看到一个说得好的,记录一下。 前言 在我们使用git的时候用的更新代码是git fetch,git pull这两条指令。但是有没有小伙伴去思考过这两者的区别呢&#xff…

统计3个点在3维空间的分布

在4*4*4的立方体中,随机取3个点,有64*63*62/641664个结构, 21440 % 20224 % 1 1728 0.0415 17 1728 0.041475 2 1728 0.0415 18 1728 0.041475 3 576 0.0138 19 384 0.009217 4 576 0.0138 20 3456 0.082949 5 …

简述SD-WAN组网的五大技术优势

在信息时代,企业对网络的需求不再局限于简单的连接,而是追求更加高效、灵活和可靠的网络架构。SD-WAN(软件定义广域网)作为一项先进的组网技术,以其独特的优势成为企业网络升级的热门选择。本文将深入探讨SD-WAN的技术…

Ubuntu 虚拟机环境,编译AOSP源码

环境 : VMware虚拟机 Ubuntu 20.04.3 LTS 搭建配置开发环境 sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl…

2023年全球运维大会(GOPS深圳站)-核心PPT资料下载

一、峰会简介 1、大会背景与概述 全球运维大会(GOPS)是运维领域最具影响力的国际盛会,每年都会汇聚世界各地的运维专家、企业领袖、技术爱好者,共同探讨运维技术的最新发展、最佳实践以及面临的挑战。2023年GOPS深圳站作为该系列…

JDK21+HADOOP3.2.2+Windows安装步骤

哈哈哈 最近转战大数据这块了,分享一下hadoop3.2.2的安装步骤 借鉴了不少大佬的文章,如有雷同,都是大佬们的 1.JDK安装 我选择的是JDK21 以下是下载网址和截图,这个没有太多的,一般下载最新的就可以 JDK: Java Down…

Excel 如何把一句话里的特定字标记颜色

方案: 借助Work功能 诉求:把如下Excel内容里所有的天标记为红色 第一步:复制到World里 第二步: CtrlH 然后如图执行替换 第3步:World 复制会 Excel

HTML---CSS美化网页元素

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.div 标签&#xff1a; <div>是HTML中的一个常用标签&#xff0c;用于定义HTML文档中的一个区块&#xff08;或一个容器&#xff09;。它可以包含其他HTML元素&#xff0c;如文本、图像…

引领半导体划片机行业,实现钛酸锶基片切割的卓越效能

在当今快速发展的半导体行业中&#xff0c;博捷芯以其卓越的技术实力和精准的行业应用&#xff0c;脱颖而出&#xff0c;再次引领行业潮流。这次&#xff0c;他们将先进的BJX3356划片机技术应用于钛酸锶基片的切割&#xff0c;为半导体制造行业的进一步发展提供了强大的技术支持…

olap/clickhouse-编译器优化与向量化

本文主要结合15721和clickhouse源码来聊聊向量化&#xff0c;正好我最近也在用Eigen做算子加速&#xff0c;了解下还是有好处的。 提示编译器 提示编译器而不是复杂化简单的代码 什么时候使用汇编&#xff0c;什么时候使用SIMD&#xff1f;下面有几个基本原则&#xff1a; …

饥荒Mod 开发(十六):五格装备栏

饥荒Mod 开发(十五)&#xff1a;小地图显示物品 源码 饥荒中的装备栏只有3个实在太少了&#xff0c;手&#xff0c;头&#xff0c;身体。 身体上装备的物品会有冲突&#xff0c;很多不能一起装备&#xff0c;比如 衣服&#xff0c;项链&#xff0c;背包等。 而这三种物品又有自…