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) 中解包出 node 和 v。
  • 学习点: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*v 和 2*v+1 是数学运算。
  • 学习点 :Python中列表方法通过点号 . 调用,运算符(如 *、+)直接使用,支持动态扩展列表。

9. 返回语句与比较

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

Python语法特点总结

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

  1. 缩进定义代码块

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

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

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

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

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

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

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

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

应用到代码的理解

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

  • 每个节点被赋予一个编号(从1开始,左子节点为 2*v,右子节点为 2*v+1)。
  • 如果最后一节点的编号等于节点总数,则为完全二叉树。
相关推荐
卷无止境6 小时前
独立开发者的"富矿地带":哪些垂直领域值得你押注一辈子?
后端·python
狼爷7 小时前
从零用 Java 构建 AI Agent 框架:JavaManus 设计与实现深度解析
后端·langchain·aigc
郑州光合科技余经理7 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
专业程序开发源7 小时前
springboot简历管理系统81389-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计
专业程序开发源8 小时前
springboot社区养老系统44071-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·django·php·课程设计
小呆呆6668 小时前
副业搞起来,小说,漫画,漫剧的成本优化思路
前端·后端·面试
周杰伦fans8 小时前
8GB显存下模型量化实战指南
人工智能·后端·c#
小蒜学长9 小时前
基于SpringBoot的佳新超市管理系统设计与实现系统(代码+数据库+LW)
java·数据库·spring boot·后端·佳新超市管理系统
IT_陈寒9 小时前
Vite静态资源导入这个坑我帮你们踩过了
前端·人工智能·后端
打工仔折腾 AI10 小时前
把AI Agent托管在家用电脑:UU远程终端与端口映射实测记录
人工智能·后端·python·langchain·ai agent 实战