958:二叉树的完全性检验

ini 复制代码
class Solution(object):
    def isCompleteTree(self,root):
        nodes = [(root,1)]
        i = 0
        while i<len(nodes):
            node,v = nodes[i]
            i+=1
            if node:
                nodes.append((node.left,2*v))
                nodes.append((node.right,2*v+1))
        
        return nodes[-1][1] == len(nodes)

代码分析与语法特点提取

1. 类定义

kotlin 复制代码
class Solution(object):
  • 语法特点class 关键字用于定义类,后面跟类名 Solution,括号中的 object 表示继承自基类 object(Python 3中默认继承,可省略)。
  • 学习点 :Python使用 class 创建面向对象编程的类,类名通常采用驼峰命名法(如 Solution),继承关系通过括号指定。

2. 方法定义

ruby 复制代码
def isCompleteTree(self, root):
  • 语法特点def 关键字定义函数,函数名 isCompleteTree 后跟参数列表 (self, root)self 是类方法的第一个参数,表示实例自身。
  • 学习点 :Python中类方法必须显式声明 self 参数(约定俗成),表示对实例的引用;参数后跟冒号 : 开始函数体,缩进表示代码块。

3. 列表初始化与元组

ini 复制代码
nodes = [(root, 1)]
  • 语法特点[] 创建列表,() 创建元组,[(root, 1)] 是一个包含单个元组的列表,元组 (root, 1) 表示节点和它的编号。
  • 学习点 :Python中列表是可变序列,元组是不可变序列;用等号 = 赋值变量,无需声明类型(动态类型)。

4. 变量赋值与增量

css 复制代码
i = 0
i += 1
  • 语法特点 :直接用 = 赋值,+= 是增量赋值运算符,相当于 i = i + 1
  • 学习点 :Python变量无需提前声明类型,赋值即定义;支持多种复合赋值运算符(如 +=, -=, *= 等)。

5. while 循环

lua 复制代码
while i < len(nodes):
  • 语法特点while 关键字后跟条件表达式 i < len(nodes),条件后接冒号 :,循环体用缩进表示。
  • 学习点 :Python中循环和条件语句不使用大括号 {},而是依赖缩进(通常4个空格)划分代码块;len() 是内置函数,返回序列长度。

6. 元组解包

ini 复制代码
node, v = nodes[i]
  • 语法特点 :通过多重赋值从元组 (node, v) 中解包出 nodev
  • 学习点:Python支持元组解包,变量数量必须与元组元素数量匹配,简洁且常用。

7. 条件语句

yaml 复制代码
if node:
  • 语法特点if 后跟条件表达式,条件后接冒号 :,条件体用缩进表示;这里 node 被用作布尔值(非空为真,空为假)。
  • 学习点 :Python中条件语句无需括号包裹条件表达式,对象的"真假性"由其值决定(例如,None 或空对象为假)。

8. 列表追加

bash 复制代码
nodes.append((node.left, 2*v))
nodes.append((node.right, 2*v+1))
  • 语法特点append() 是列表的内置方法,用于添加元素;2*v2*v+1 是数学运算。
  • 学习点 :Python中列表方法通过点号 . 调用,运算符(如 *+)直接使用,支持动态扩展列表。

9. 返回语句与比较

scss 复制代码
return nodes[-1][1] == len(nodes)
  • 语法特点return 返回结果,nodes[-1] 表示列表最后一个元素,[1] 访问元组的第二个元素,== 是相等比较运算符。
  • 学习点 :Python支持负索引(-1 表示最后一个元素),返回语句直接返回表达式的布尔值;比较运算符返回 TrueFalse

Python语法特点总结

基于以上分析,以下是Python的关键语法特点,供你学习:

  1. 缩进定义代码块

    • Python不使用 {},而是用缩进(通常4个空格)划分代码块,例如循环体、函数体等。
  2. 动态类型

    • 变量无需声明类型,直接赋值即可使用,例如 i = 0nodes = [(root, 1)]
  3. 面向对象

    • 使用 class 定义类,方法中显式使用 self 表示实例自身。
  4. 简洁的循环与条件语句

    • whileif 后接条件,条件后用冒号 :,无需括号包裹条件表达式。
  5. 序列操作

    • 支持列表([])、元组(()),提供丰富的内置方法(如 append())和索引(如 nodes[-1])。
  6. 元组解包

    • 可通过多重赋值从元组或列表中提取元素,例如 node, v = nodes[i]
  7. 内置函数与运算符

    • len() 获取长度,== 等比较运算符直接返回布尔值,数学运算简洁明了。
  8. 无分号结尾

    • Python语句无需用分号 ; 结束,换行即表示语句结束。

应用到代码的理解

这段代码使用队列(列表 nodes)和层序遍历的思想,检查二叉树是否为完全二叉树:

  • 每个节点被赋予一个编号(从1开始,左子节点为 2*v,右子节点为 2*v+1)。
  • 如果最后一节点的编号等于节点总数,则为完全二叉树。
相关推荐
lgily-122523 分钟前
常用的设计模式详解
java·后端·python·设计模式
意倾城1 小时前
Spring Boot 配置文件敏感信息加密:Jasypt 实战
java·spring boot·后端
火皇4051 小时前
Spring Boot 使用 OSHI 实现系统运行状态监控接口
java·spring boot·后端
薯条不要番茄酱2 小时前
【SpringBoot】从零开始全面解析Spring MVC (一)
java·spring boot·后端
懵逼的小黑子9 小时前
Django 项目的 models 目录中,__init__.py 文件的作用
后端·python·django
小林学习编程10 小时前
SpringBoot校园失物招领信息平台
java·spring boot·后端
java1234_小锋12 小时前
Spring Bean有哪几种配置方式?
java·后端·spring
柯南二号13 小时前
【后端】SpringBoot用CORS解决无法跨域访问的问题
java·spring boot·后端
每天一个秃顶小技巧14 小时前
02.Golang 切片(slice)源码分析(一、定义与基础操作实现)
开发语言·后端·python·golang
gCode Teacher 格码致知15 小时前
《Asp.net Mvc 网站开发》复习试题
后端·asp.net·mvc