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的关键语法特点,供你学习:
-
缩进定义代码块
- Python不使用
{},而是用缩进(通常4个空格)划分代码块,例如循环体、函数体等。
- Python不使用
-
动态类型
- 变量无需声明类型,直接赋值即可使用,例如
i = 0或nodes = [(root, 1)]。
- 变量无需声明类型,直接赋值即可使用,例如
-
面向对象
- 使用
class定义类,方法中显式使用self表示实例自身。
- 使用
-
简洁的循环与条件语句
while和if后接条件,条件后用冒号:,无需括号包裹条件表达式。
-
序列操作
- 支持列表(
[])、元组(()),提供丰富的内置方法(如append())和索引(如nodes[-1])。
- 支持列表(
-
元组解包
- 可通过多重赋值从元组或列表中提取元素,例如
node, v = nodes[i]。
- 可通过多重赋值从元组或列表中提取元素,例如
-
内置函数与运算符
len()获取长度,==等比较运算符直接返回布尔值,数学运算简洁明了。
-
无分号结尾
- Python语句无需用分号
;结束,换行即表示语句结束。
- Python语句无需用分号
应用到代码的理解
这段代码使用队列(列表 nodes)和层序遍历的思想,检查二叉树是否为完全二叉树:
- 每个节点被赋予一个编号(从1开始,左子节点为
2*v,右子节点为2*v+1)。 - 如果最后一节点的编号等于节点总数,则为完全二叉树。