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 0
    count_left = countNodes(root.left)
    count_right = countNodes(root.right)
    return count_left + count_right + 1

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

def countNodes(root):
    if not root:
        return 0
    stack_record = [root]
    count = 0
    while stack_record:
        node = stack_record.pop()
        count += 1
        if 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 0
    height = 0
    while node:
        node = node.left
        height += 1
    return height

def get_count(height):
    num = 2**height - 1
    return num

def countNodes(root):
    if not root:
        return 0
    left_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 0
    left = root.left
    right = root.right
    left_height = 1
    right_height = 1
    while left:
        left_height += 1
        left = left.left
    while right:
        right_height += 1
        right = right.right
    if 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 0
        count = 1
        left = root.left; right = root.right
        while left and right:
            count += 1
            left = left.left; right = right.right
        if not left and not right: # 如果同时到底说明是满二叉树,反之则不是
            return 2**count-1
        return 1 + self.countNodes(root.left) + self.countNodes(root.right)

平衡二叉树

Key Points

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

相关题目

110. 平衡二叉树

视频讲解

后序遍历求高度

重点分析

在这里插入图片描述

def isBalanced(root):
    if not root:
        return True

    height = get_height(root)
    if height == -1:
        return False
    return True

def get_height(node):
    if not node:
        return 0
    left_height = get_height(node.left)
    right_height = get_height(node.right)

    if left_height == -1 or right_height == -1:
        return -1

    if abs(left_height - right_height) > 1:
        return -1
    return 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 paths
    
    def _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 0

    res = 0
    if isLeave(root.left):
        res += root.left.val
        res += sumOfLeftLeaves(root.right)
    else:
        res += sumOfLeftLeaves(root.left) + sumOfLeftLeaves(root.right)
    return res

def isLeave(node):
    if node:
        if not node.left and not node.right:
            return True
    return False

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

def sumOfLeftLeaves(root):
    if not root:
        return 0
    stack_record = [root]
    res = 0
    while stack_record:
        node = stack_record.pop()
        if isLeave(node.left):
            res += node.left.val
            if 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 0
    stack_record = [root]
    res = 0
    while stack_record:
        node = stack_record.pop()
        if isLeave(node.left):
            res += node.left.val
        if node.right:
            stack_record.append(node.right)
        if node.left:
            stack_record.append(node.left)

    return res

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

曲线拟合、多项式拟合、最小二乘法

最近在做自车轨迹预测的工作,遇到 曲线拟合、多项式拟合、最小二乘法这些概念有点不清晰, 做一些概念区别的总结: 曲线拟合用于查找一系列数据点的“最佳拟合”线或曲线。 大多数情况下,曲线拟合将产生一个函数,可用于…

【数据结构与算法】(7)基础数据结构之双端队列的链表实现、环形数组实现示例讲解

目录 2.6 双端队列1) 概述2) 链表实现3) 数组实现习题E01. 二叉树 Z 字层序遍历-Leetcode 103 2.6 双端队列 1) 概述 双端队列、队列、栈对比 定义特点队列一端删除(头)另一端添加(尾)First In First Out栈一端删除和添加&…

网工内推 | 金融业网络安全岗,最高40K*15薪,CISP认证优先

01 国泰产险 招聘岗位:资深信息安全工程师 职责描述: 1、负责公司云平台业务系统的安全规划设计,协助业务系统制定安全解决方案; 2、负责建立公司信息安全标准,制定平台安全策略,安全加固,防范…

数据可视化 pycharts实现中国各省市地图数据可视化

自用版 数据格式如下: 运行效果如下: import pandas as pd from pyecharts.charts import Map, TreeMap, Timeline, Page, WordCloud from pyecharts import options as opts from pyecharts.commons.utils import JsCode from pyecharts.globals im…

js逆向-某验3代滑块验证码分析

声明 本文仅供学习参考,如有侵权可私信本人删除,请勿用于其他途径,违者后果自负! 如果觉得文章对你有所帮助,可以给博主点击关注和收藏哦! 插句个人内容:本人最近正在找工作,工作城…

alibabacloud学习笔记05(小滴课堂)

高并发下的微服务存在的问题 高并发下的微服务容错方案 介绍什么是分布式系统的流量防卫兵Sentinel 微服务引入Sentinel和控制台搭建 每个服务都加上这个依赖。 启动方式: 讲解AliababCloud微服务整合Sentinel限流配置实操 我们在order和video模块都加上。 分别启动…

第三百零六回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"分享三个使用TextField的细节"沉浸式状态样相关的内容,本章回中将介绍如何创建单例模式.闲话休提,让我们一起Talk Flutter吧。 1.…

回归预测 | Matlab实现POA-CNN-LSTM-Attention鹈鹕算法优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制)

回归预测 | Matlab实现POA-CNN-LSTM-Attention鹈鹕算法优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制) 目录 回归预测 | Matlab实现POA-CNN-LSTM-Attention鹈鹕算法优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制&…

超时引发的牛角尖二(hystrix中的超时)

至今我都清楚记得自己负责的系统请求云上关联系统时所报的异常信息。为了解决这个异常,我坚持让这个关联系统的负责人查看,并且毫不顾忌他的嘲讽和鄙视,甚至无视他烦躁的情绪。不过我还是高估了自己的脸皮,最终在其恶狠狠地抛下“…

智能决策的艺术:探索商业分析的最佳工具和方法

文章目录 一、引言二、商业分析思维概述三、数据分析在商业实践中的应用四、如何培养商业分析思维与实践能力五、结论《商业分析思维与实践:用数据分析解决商业问题》亮点内容简介作者简介目录获取方式 一、引言 随着大数据时代的来临,商业分析思维与实…

前端小案例——滚动文本区域(HTML+CSS, 附源码)

一、前言 实现功能: 这个案例实现了一个具有滚动功能的文本区域&#xff0c;用于显示长文本内容&#xff0c;并且可以通过滚动条来查看完整的文本内容。 实现逻辑&#xff1a; 内容布局&#xff1a;在<body>中&#xff0c;使用<div>容器创建了一个类名为listen_t…

vue3 之 组合式API—watch函数

watch函数 作用&#xff1a;侦听一个或者多个数据的变化&#xff0c;数据变化时执行回调函数 两个额外参数&#xff1a; 1.immediate&#xff08;立即执行&#xff09;2.deep&#xff08;深度侦听&#xff09; 场景&#xff1a;比如选择不同的内容请求后端不同数据时 如下图 …

【算法与数据结构】300、674、LeetCode最长递增子序列 最长连续递增序列

文章目录 一、300、最长递增子序列二、674、最长连续递增序列三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、300、最长递增子序列 思路分析&#xff1a; 第一步&#xff0c;动态数组的含义。 d p [ i ] dp[i] dp[i…

IDEA 配置以及一些技巧

1. IDEA设置 1.1 设置主题 1.2 设置字体和字体大小 1.3 编辑区的字体用ctrl鼠标滚轮可以控制大小 1.4 自动导包和优化多余的包 1.5 设置编码方式 1.6 配置 maven 1.7 设置方法形参参数提示 1.8 设置控制台的字体和大小 注意&#xff1a;设置控制台字体和大小后需要重启IDEA才会…

异步解耦之RabbitMQ(二)_RabbitMQ架构及交换机

异步解耦之RabbitMQ(一)-CSDN博客 RabbitMQ架构 RabbitMQ是一个基于AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;协议的消息代理中间件&#xff0c;它通过交换机和队列实现消息的路由和分发。以下是RabbitMQ的架构图&#xff1a; Producer&#xff08;生产…

LabVIEW风力发电机在线监测

LabVIEW风力发电机在线监测 随着可再生能源的发展&#xff0c;风力发电成为越来越重要的能源形式。设计了一个基于控制器局域网&#xff08;CAN&#xff09;总线和LabVIEW的风力发电机在线监测系统&#xff0c;实现风力发电机的实时监控和故障诊断&#xff0c;以提高风力发电的…

ArrayList在添加元素时报错java.lang.ArrayIndexOutOfBoundException

一、添加单个元素数组越界分析 add源码如下 public boolean add(E e) {ensureCapacityInternal(size 1); // Increments modCount!!elementData[size] e;return true; } size字段的定义 The size of the ArrayList (the number of elements it contains). ArrayList的大…

【面试官问】Redis 持久化

目录 【面试官问】Redis 持久化 Redis 持久化的方式RDB(Redis DataBase)AOF(Append Only File)混合持久化:RDB + AOF 混合方式的持久化持久化最佳方式控制持久化开关主从部署使用混合持久化使用配置更高的机器参考文章所属专区

【Django】Cookie和Session的使用

Cookies和Session 1. 会话 从打开浏览器访问一个网站&#xff0c;到关闭浏览器结束此次访问&#xff0c;称之为一次会话。 HTTP协议是无状态的&#xff0c;导致会话状态难以保持。 Cookies和Session就是为了保持会话状态而诞生的两个存储技术。 2. Cookies 2.1 Cookies定…

机器学习系列——(六)数据降维

引言 在机器学习领域&#xff0c;数据降维是一种常用的技术&#xff0c;旨在减少数据集的维度&#xff0c;同时保留尽可能多的有用信息。数据降维可以帮助我们解决高维数据带来的问题&#xff0c;提高模型的效率和准确性。本文将详细介绍机器学习中的数据降维方法和技术&#…