python coding with ChatGPT 打卡第16天| 二叉树:完全二叉树、平衡二叉树、二叉树的所有路径、左叶子之和

相关推荐
python coding with ChatGPT 打卡第12天| 二叉树:理论基础
python coding with ChatGPT 打卡第13天| 二叉树的深度优先遍历
python coding with ChatGPT 打卡第14天| 二叉树的广度优先遍历
python coding with ChatGPT 打卡第15天| 二叉树:翻转二叉树、对称二叉树

文章目录

  • 完全二叉树的节点个数
    • Key Points
    • 相关题目
    • 视频讲解
    • 重点分析
  • 平衡二叉树
    • Key Points
    • 相关题目
    • 视频讲解
    • 重点分析
    • 拓展
  • 二叉树的所有路径
    • 相关题目
    • 视频讲解
    • 重点分析
  • 左叶子之和
    • Key Points
    • 相关题目
    • 视频讲解
    • 重点分析

完全二叉树的节点个数

Key Points

  1. 利用完全二叉树的性质:完全二叉树是一种特殊的二叉树,除了最底层,其它每一层都被完全填满,而且最底层从左到右填入节点。

相关题目

222. 完全二叉树的节点个数

视频讲解

理解普通二叉树和完全二叉树的区别

重点分析

首先,我们来思考一下如何递归地解决这个问题,再考虑是否有更高效的方法。

方法一:

def countNodes(root):if not root:return 0count_left = countNodes(root.left)count_right = countNodes(root.right)return count_left + count_right + 1

方法二:(迭代法遍历节点)

def countNodes(root):if not root:return 0stack_record = [root]count = 0while stack_record:node = stack_record.pop()count += 1if node.right:stack_record.append(node.right)if node.left:stack_record.append(node.left)return count

解决这个问题的关键是利用完全二叉树的性质。
完全二叉树的高度可以通过连续地访问左子树来确定。
在这里插入图片描述

在这里插入图片描述

方法三:
如果左子树的高度等于右子树的高度,则为满二叉树

def get_height(node):if not node:return 0height = 0while node:node = node.leftheight += 1return heightdef get_count(height):num = 2**height - 1return numdef countNodes(root):if not root:return 0left_height = get_height(root.left)right_height = get_height(root.right)if left_height > right_height:right_count = get_count(right_height)left_count = countNodes(root.left)else:left_count = get_count(left_height)right_count = countNodes(root.right)return 1+left_count+right_count

方法四:
在完全二叉树中,如果递归向左遍历的深度等于递归向右遍历的深度,那说明就是满二叉树。

def countNodes(root):if not root:return 0left = root.leftright = root.rightleft_height = 1right_height = 1while left:left_height += 1left = left.leftwhile right:right_height += 1right = right.rightif left_height == right_height:return get_count(left_height)return countNodes(root.left) + countNodes(root.right) + 1
class Solution: # 利用完全二叉树特性def countNodes(self, root: TreeNode) -> int:if not root: return 0count = 1left = root.left; right = root.rightwhile left and right:count += 1left = left.left; right = right.rightif not left and not right: # 如果同时到底说明是满二叉树,反之则不是return 2**count-1return 1 + self.countNodes(root.left) + self.countNodes(root.right)

平衡二叉树

Key Points

判断一个二叉树是否是高度平衡的,其定义是:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是高度平衡的二叉树。

相关题目

110. 平衡二叉树

视频讲解

后序遍历求高度

重点分析

在这里插入图片描述

def isBalanced(root):if not root:return Trueheight = get_height(root)if height == -1:return Falsereturn Truedef get_height(node):if not node:return 0left_height = get_height(node.left)right_height = get_height(node.right)if left_height == -1 or right_height == -1:return -1if abs(left_height - right_height) > 1:return -1return 1 + max(left_height, right_height)

这种方法的好处是它在计算高度的同时检查平衡性,只需遍历树一次,提高了效率。

拓展

在这里插入图片描述

二叉树的所有路径

相关题目

257. 二叉树的所有路径

视频讲解

递归中带着回溯

重点分析

方法一:
递归法

在这里插入图片描述

class Solution:def binaryTreePaths(self, root: TreeNode) -> [str]:if not root:return []paths = []self._findPaths(root, "", paths)return pathsdef _findPaths(self, node, path, paths):# 更新当前路径currentPath = path + str(node.val)# 如果是叶子节点,添加路径到结果列表if not node.left and not node.right:paths.append(currentPath)else:# 如果不是叶子节点,递归遍历子节点if node.left:self._findPaths(node.left, currentPath + "->", paths)if node.right:self._findPaths(node.right, currentPath + "->", paths)# 示例使用
# 假设我们有一个二叉树,我们可以创建这个树的节点,并调用上述函数
# 比如:
#     1
#    / \
#   2   3
#    \
#     5
# root = TreeNode(1)
# root.left = TreeNode(2)
# root.right = TreeNode(3)
# root.left.right = TreeNode(5)
# solution = Solution()
# print(solution.binaryTreePaths(root))

方法二:
迭代法(更好理解)

在这里插入图片描述

class Solution:def binaryTreePaths(self, root: TreeNode) -> [str]:if not root:return []paths = []stack = [(root, str(root.val))]  # 初始化栈,包含节点和路径while stack:node, path = stack.pop()  # 取出当前节点和路径# 如果是叶子节点,添加路径到结果列表if not node.left and not node.right:paths.append(path)else:# 如果不是叶子节点,更新路径并将子节点加入栈if node.right:stack.append((node.right, path + "->" + str(node.right.val)))if node.left:stack.append((node.left, path + "->" + str(node.left.val)))return paths

在这个迭代版本中,我们使用了一个栈来存储每个节点以及从根节点到该节点的路径。这种方法模拟了递归过程的深度优先搜索(DFS)前序遍历,确保了我们能够访问到每一个叶子节点,并在到达叶子节点时记录完整的路径。

这种迭代方法提供了一种不使用系统调用栈的递归的替代方案,对于深度非常大的树来说,可以避免递归导致的栈溢出问题。

左叶子之和

Key Points

  1. 要注意是判断左叶子,不是二叉树左侧节点
  2. 判断是否是左叶子,需要通过父节点来判断

相关题目

404. 左叶子之和

视频讲解

总有一些规则让你找不到北

重点分析

方法一:
递归法:

def sumOfLeftLeaves(root):if not root:return 0res = 0if isLeave(root.left):res += root.left.valres += sumOfLeftLeaves(root.right)else:res += sumOfLeftLeaves(root.left) + sumOfLeftLeaves(root.right)return resdef isLeave(node):if node:if not node.left and not node.right:return Truereturn False

方法二:
迭代法(更好理解)

def sumOfLeftLeaves(root):if not root:return 0stack_record = [root]res = 0while stack_record:node = stack_record.pop()if isLeave(node.left):res += node.left.valif node.right:stack_record.append(node.right)else:if node.right:stack_record.append(node.right)if node.left:stack_record.append(node.left)return res

精简版:

def sumOfLeftLeaves(root):if not root:return 0stack_record = [root]res = 0while stack_record:node = stack_record.pop()if isLeave(node.left):res += node.left.valif node.right:stack_record.append(node.right)if node.left:stack_record.append(node.left)return res

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

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

相关文章

Python中类的定义和使用

Python是一门面向对象的编程语言,类是面向对象编程的核心概念之一。类是对象的蓝图,用来定义对象的属性和方法,通过实例化类可以创建对象。本文将介绍Python中类的定义和使用方法。 1. 类的定义 在Python中,使用关键字cl…

Ai知识图谱

总结:从AI技术栈全貌来看,基础模型、基础算法,个人及小公司是玩不起的,大公司才有对应人力、财力、算力 去做,个人更多的是要在应用场景上创新,几个关键的技术必须会:编码语言(Pytho…

NLP入门系列—词嵌入 Word embedding

NLP入门系列—词嵌入 Word embedding 2013年,Word2Vec横空出世,自然语言处理领域各项任务效果均得到极大提升。自从Word2Vec这个神奇的算法出世以后,导致了一波嵌入(Embedding)热,基于句子、文档表达的wor…

数据描述的统计量解释-上

目录 一.导读 二.介绍 ①算数平均数 ②几何平均数 ③标准差 ④变异系数 ⑤分位数 ⑥方差 三.结尾 一.导读 在讲到数据描述的时候,我们提及了数据集中位置、离散程度、偏度和峰度以及单个数据变量的分布情况。而在这些当中,我们遇到了一些统计量…

[Python] opencv - 什么是直方图?如何绘制图像的直方图?

什么是直方图? 直方图是一种统计图,用于展示数据的分布情况。它将数据按照一定的区间或者组进行划分,然后计算在每个区间或组内的数据频数或频率(即数据出现的次数或占比),然后用矩形或者柱形图的形式将这…

空中加油3D可视化:引领航空领域的新革命

随着科技的日新月异,我们生活的方方面面都在发生着深刻的变化。而在航空领域,3D可视化技术正在引领新的革命。它不仅为飞行员提供了一种全新的视角,更在保障飞行安全、提高飞行效率方面发挥着不可替代的作用。 在传统的空中加油中&#xff0c…

Vulnhub靶机:hacksudo2 (HackDudo)

一、介绍 运行环境:Virtualbox 攻击机:kali(10.0.2.15) 靶机:hacksudo2 (HackDudo)(10.0.2.44) 目标:获取靶机root权限和flag 靶机下载地址:https://download.vulnh…

树莓派5一键安装C++版本OpenCV

安装环境 本人当前的安装环境: 树莓派5Raspberry Pi os (64-bit) Debian12 Bookworm 镜像下载地址 我这里是将镜像安装好后直接安装opencv,如果不是刚安装好的镜像需要注意是否有openCV的python之类的安装过,不然可能出现编译错误 一、扩展内…

ShardingSphere 5.x 系列【3】分库分表中间件技术选型

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 前言2. My Cat3. ShardingSphe…

数据链路层相关知识

1.1 以太网(横跨数据链路层和物理层) 数据帧格式 数据链路层,引入另外一套地址体系,称为“mac地址” / 物理地址。(mac地址和IP地址是独立的俩套地址体系) 1.2 mac MAC 地址,即 Media Access …

ProcessSlot构建流程分析

ProcessorSlot ProcessorSlot构建流程 // com.alibaba.csp.sentinel.CtSph#lookProcessChain private Entry entryWithPriority(ResourceWrapper resourceWrapper, int count, boolean prioritized, Object... args)throws BlockException {// 省略创建 Context 的代码// 黑盒…

冻结Prompt微调LM: T5 PET

T5 paper: 2019.10 Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer Task: Everything Prompt: 前缀式人工prompt Model: Encoder-Decoder Take Away: 加入前缀Prompt,所有NLP任务都可以转化为文本生成任务 T5论文的初衷如…