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)。
  • 如果最后一节点的编号等于节点总数,则为完全二叉树。
相关推荐
Chenyiax5 小时前
从 Chat 到 Responses:OpenAI API 抽象为什么变了?
后端
MariaH5 小时前
Koa和Express的区别
后端
MariaH5 小时前
Koa框架的使用
后端
luckdewei6 小时前
那个用 passlib 做认证的新同事,上线第一天就把用户密码写进了日志
后端
ping某8 小时前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
JustHappy8 小时前
我汇总了身边朋友的经历才发现,其实第一份实习是最难找的......
前端·后端·面试
uhakadotcom8 小时前
在python 的 工程化架构中 ,什么是 薄包装器层?
后端·面试·github
用户14748530797412 小时前
CodeX使用Skill生成游戏美术和音乐资源,一分钟入门
后端
Melody12312 小时前
用 abort 中断 AI 流式请求,我之前做错了
后端
onething36513 小时前
Spring Boot + Spring AI 从入门到实战:7天转型计划 Day 5 —— SSE 流式输出 + 打字机效果
人工智能·后端·全栈