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)。
  • 如果最后一节点的编号等于节点总数,则为完全二叉树。
相关推荐
编程_大白30 分钟前
1.Go - Hello World
开发语言·后端·golang
重庆穿山甲39 分钟前
观察者模式实战指南:解耦神器
后端
A-Kamen1 小时前
Spring Boot中定时任务Cron表达式的终极指南
java·spring boot·后端
小胖墩有点瘦1 小时前
基于SpringBoot的社区/物业管理系统
java·spring boot·后端·计算机外设·物业管理系统·社区管理系统
曲鸟1 小时前
想不写代码,造大量的数据该怎么办
前端·后端·python
数字扫地僧2 小时前
零基础搭建智能法律知识库!腾讯云HAI实战教程
后端
未完结小说2 小时前
ThreadLocal 原理解析
后端
雷渊2 小时前
MySQL中FIND_IN_SET函数的深度解析与应用指南
java·后端·面试
顾言2 小时前
23 种设计模式中的访问者模式
后端·设计模式
侃java2 小时前
使用 AsposeWord 向 word 中的文字添加标签
后端·wordpress