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
)。 - 如果最后一节点的编号等于节点总数,则为完全二叉树。