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)。
  • 如果最后一节点的编号等于节点总数,则为完全二叉树。
相关推荐
编程(变成)小辣鸡18 分钟前
如何防止接口被恶意刷?
java·后端·网络安全
葫芦和十三8 小时前
图解 MongoDB 30|查询路由与广播查询:带片键定向,不带就广播
后端·mongodb·agent
葫芦和十三8 小时前
图解 MongoDB 29|分片键陷阱:jumbo chunk、孤儿文档和写入热点
后端·mongodb·agent
进击的程序猿~8 小时前
Go Zero源码阅读1
后端·golang
2601_961593429 小时前
Rust 开发环境配置繁琐?RustRover 开箱即用搞定编码调试
开发语言·后端·macos·rust
犀利豆11 小时前
AI in Harness(三)
人工智能·后端
IT_陈寒12 小时前
Java的Stream.parallel()把我CPU跑爆了,这种优化要谨慎
前端·人工智能·后端
子兮曰13 小时前
Bun 重写为 Rust:11天、64个Claude、16.5万美元,一次改变行业认知的激进实验
前端·后端·bun
子兮曰13 小时前
Node.js v26.5.0 深度解读:import Text、流式 ReadableStreamTee、以及隐藏的安全加固浪潮
前端·后端·node.js
子兮曰13 小时前
TypeScript 7.0 RC 深度解读:Go 重写完成,10 倍提速,编译器的「奇点时刻」
前端·后端·typescript