当前位置: 首页 > news >正文

代码随想录算法训练营day12(二叉树)

华子目录

  • 平衡二叉树
    • 思路
  • 二叉树的所有路径
    • 思路
  • 左叶子之和
    • 思路
  • 完全二叉树的节点个数
    • 思路

平衡二叉树

  • https://leetcode.cn/problems/balanced-binary-tree/

在这里插入图片描述

思路

  • 什么是平衡二叉树左子树的高度右子树的高度相差不超过1
  • isBalanced用来判断是否为平衡二叉树,如果当前树不是平衡二叉树,直接返回最终结果False。如果当前树为平衡二叉树,就再判断其左右子树左右子树也必须为平衡二叉树
  • cal_depth用来求一个子树的最大深度,这是之前讲过的内容(求最大深度、最小深度、节点个数,都是基础内容
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def cal_depth(self,root):cur = rootif not cur:return 0leftHeight = self.cal_depth(cur.left)rightHeight = self.cal_depth(cur.right)height = 1 + max(leftHeight, rightHeight)return heightdef isBalanced(self, root: Optional[TreeNode]) -> bool:if not root:return Trueleft_depth = self.cal_depth(root.left)    # 求出左子树的深度right_depth = self.cal_depth(root.right)   # 求出右子树的深度if abs(left_depth - right_depth) > 1:    # 相差return Falsereturn self.isBalanced(root.left) and self.isBalanced(root.right)

二叉树的所有路径

  • https://leetcode.cn/problems/binary-tree-paths/

在这里插入图片描述

思路

  • 这道题是使用回溯来求解,第一次接触回溯法,多看看视频来理解。

具体写法

  • 递归的写法里传入三个参数(1)当前处理的节点(2)当前的路径(3)总的结果集
  • 递归的终止条件:当节点叶子节点时,把当前路径加入结果集
  • 递归的单层处理当node有左节点时递归处理左节点处理结束后回溯当node有右节点时递归处理右节点处理结束后回溯
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def travel(self, node, path, res):if not node.left and not node.right:   # node为叶子节点path = [str(x) for x in path]res.append('->'.join(path))   # 将某一条路径加入到总的结果集当中if node.left:  # 左有值path.append(node.left.val)self.travel(node.left, path, res)path.pop() # 某一条路线递归结束后,弹出if node.right:  # 右有值path.append(node.right.val)self.travel(node.right, path, res)path.pop()  # 某一条路径递归结束后,弹出def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:cur = rootif not cur:return []res = []   # 记录所有路径path = [cur.val]  # 记录当前路径self.travel(cur,path, res)return res

左叶子之和

  • https://leetcode.cn/problems/sum-of-left-leaves/description/

在这里插入图片描述

思路

  • 使用后序遍历

在这里插入图片描述

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int:if not root:  # 终止条件,当前节点为空return 0if not root.left and not root.right:  # 终止条件,当前节点是叶子节点return 0left_num = self.sumOfLeftLeaves(root.left)right_num = self.sumOfLeftLeaves(root.right)cur_num = 0if root.left and not root.left.left and not root.left.right: # # root.left 是左叶子cur_num = root.left.val     # 记录左叶子的值return cur_num + left_num + right_num  # 三部分的汇总

完全二叉树的节点个数

  • https://leetcode.cn/problems/count-complete-tree-nodes/description/

在这里插入图片描述

思路

  • 完全二叉树当成二叉树去计算,使用后序遍历去计算
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def countNodes(self, root: Optional[TreeNode]) -> int:cur = rootif not cur:return 0left_num = self.countNodes(cur.left)right_num = self.countNodes(cur.right)result = left_num + right_num + 1   # 核心return result
http://www.xdnf.cn/news/176257.html

相关文章:

  • javaScript--数据结构和算法
  • 轮转数组(中等)
  • 如何优雅地解决AI生成内容粘贴到Word排版混乱的问题?
  • 从“世界工厂”到“智造之都”:双运放如何改写东莞产业基因?
  • JavaScript 中 undefined 和 not defined 的区别
  • Dev控件RadioGroup 如何设置一排有N个显示或分为几行
  • 使用cesium设置第一视角
  • 第2讲、Tensor高级操作与自动求导详解
  • w~嵌入式C语言~合集6
  • 【计算机哲学故事1-2】输入输出(I/O):你吸收什么,便成为什么
  • APP、游戏、网站被黑客攻击了怎么解决?
  • MongoDB 操作全解析:从部署到安全控制的详细指南(含 emoji 趣味总结)
  • 京东商品详情数据爬取难度分析与解决方案
  • Spark-Streaming核心编程(3)
  • windows开启内测压缩(亲测可用)
  • uniapp-商城-40-shop 购物车 选好了 进行订单确认4 配送方式3 地址编辑
  • C++和Java该如何选择?
  • DeepSeek智能时空数据分析(四):绘制行政区域并定制样式
  • Go 语言 核心知识点
  • 【数据挖掘】时间序列预测-时间序列的平稳性
  • 【数据挖掘】时间序列预测-常用序列预测模型
  • 深入理解Android Activity生命周期
  • 在windows使用docker打包springboot项目镜像并上传到阿里云
  • java面向对象编程【高级篇】之多态
  • 再谈从视频中学习:从给视频打字幕的Humanoid-X、UH-1到首个人形VLA Humanoid-VLA:迈向整合第一人称视角的通用人形控制
  • 虚拟数字人:从虚拟到现实的跨越与未来展望
  • 动手学深度学习11.10. Adam算法-笔记练习(PyTorch)
  • 机器人快速启动
  • 信创系统资产清单采集脚本:主机名+IP+MAC 一键生成 CSV
  • 《博客系统测试报告》