15 - 类与对象:TreeNode和ListNode必备知识
想系统提升编程能力、查看更完整的学习路线,欢迎访问 AI Compass:https://github.com/tingaicompass/AI-Compass
仓库持续更新刷题题解、Python 基础和 AI 实战内容,适合想高效进阶的你。
15 - 类与对象:TreeNode和ListNode必备知识
学习目标: 掌握Python类的基础语法,理解链表和树节点的定义
📖 知识点讲解
为什么要学类?
在算法题中,链表(模块5) 和 二叉树(模块7) 这两个模块共24道题,都需要用到节点类(Node)。
TreeNode(树节点) 和 ListNode(链表节点) 是最常见的两种类定义。
生活化比喻:
类(class)就像一个"模板"或"图纸":
- TreeNode的图纸:每个节点有value(值)、left(左孩子)、right(右孩子)
- ListNode的图纸:每个节点有val(值)、next(下一个节点)
- 根据图纸可以造出无数个节点(对象)
💻 代码示例
示例1:最简单的类
# 定义一个类
class Person:
pass # pass表示暂时什么都不做
# 创建对象(实例化)
p = Person()
print(p) # <__main__.Person object at 0x...>
示例2:带属性的类
class Person:
def __init__(self, name, age):
# __init__ 是构造函数,创建对象时自动调用
# self 代表对象自己
self.name = name # 设置属性
self.age = age
# 创建对象
alice = Person("Alice", 20)
bob = Person("Bob", 21)
# 访问属性
print(alice.name) # Alice
print(alice.age) # 20
print(bob.name) # Bob
# 修改属性
alice.age = 21
print(alice.age) # 21
关键点解释:
__init__: 构造函数,创建对象时自动调用self: 代表对象本身,必须是第一个参数self.name: 对象的属性
示例3:带方法的类
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self):
# 方法:类里面定义的函数
print(f"我是{self.name},今年{self.age}岁")
def is_adult(self):
return self.age >= 18
# 使用
alice = Person("Alice", 20)
alice.introduce() # 我是Alice,今年20岁
print(alice.is_adult()) # True
示例4:ListNode - 链表节点类
这是107道题中最重要的类定义之一!
class ListNode:
def __init__(self, val=0, next=None):
self.val = val # 节点的值
self.next = next # 指向下一个节点的指针
# 创建单个节点
node1 = ListNode(1)
print(node1.val) # 1
print(node1.next) # None
# 创建链表: 1 -> 2 -> 3
node1 = ListNode(1)
node2 = ListNode(2)
node3 = ListNode(3)
node1.next = node2 # 1指向2
node2.next = node3 # 2指向3
# 遍历链表
current = node1
while current:
print(current.val, end=" -> ") # 1 -> 2 -> 3 ->
current = current.next
print("None")
# 或者链式创建(简洁)
head = ListNode(1, ListNode(2, ListNode(3)))
可视化:
node1 node2 node3
┌─────┐ ┌─────┐ ┌─────┐
│val:1│──>│val:2│──>│val:3│──> None
│next │ │next │ │next │
└─────┘ └─────┘ └─────┘
在算法题中 (第24课:反转链表):
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def reverseList(head):
prev = None
current = head
while current:
# 保存下一个节点
next_node = current.next
# 反转指针
current.next = prev
# 移动指针
prev = current
current = next_node
return prev
示例5:TreeNode - 二叉树节点类
这是模块7(15道题)的基础!
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val # 节点的值
self.left = left # 左子节点
self.right = right # 右子节点
# 创建二叉树:
# 1
# / \
# 2 3
# / \
# 4 5
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
# 或者链式创建
root = TreeNode(1,
TreeNode(2,
TreeNode(4),
TreeNode(5)
),
TreeNode(3)
)
# 前序遍历(根-左-右)
def preorder(root):
if not root:
return
print(root.val, end=" ") # 访问根
preorder(root.left) # 遍历左子树
preorder(root.right) # 遍历右子树
preorder(root) # 1 2 4 5 3
可视化:
root
┌─┐
│1│
└┬┘
┌───┴───┐
┌┴┐ ┌┴┐
│2│ │3│
└┬┘ └─┘
┌─┴─┐
┌┴┐ ┌┴┐
│4│ │5│
└─┘ └─┘
在算法题中 (第40课:二叉树最大深度):
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def maxDepth(root):
if not root:
return 0
left_depth = maxDepth(root.left)
right_depth = maxDepth(root.right)
return max(left_depth, right_depth) + 1
示例6:特殊方法 str
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def __str__(self):
# 定义print(node)的输出格式
return f"TreeNode({self.val})"
node = TreeNode(5)
print(node) # TreeNode(5)
# 而不是: <__main__.TreeNode object at 0x...>
🎯 在算法题中的应用
应用1:链表反转(第24课)
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def reverseList(head):
prev = None
curr = head
while curr:
next_temp = curr.next # 保存下一个
curr.next = prev # 反转指针
prev = curr # prev前移
curr = next_temp # curr前移
return prev
应用2:合并两个有序链表(第25课)
def mergeTwoLists(l1, l2):
# 虚拟头节点技巧
dummy = ListNode(0)
current = dummy
while l1 and l2:
if l1.val <= l2.val:
current.next = l1
l1 = l1.next
else:
current.next = l2
l2 = l2.next
current = current.next
# 接上剩余节点
current.next = l1 if l1 else l2
return dummy.next
应用3:翻转二叉树(第41课)
def invertTree(root):
if not root:
return None
# 递归翻转左右子树
root.left, root.right = root.right, root.left
invertTree(root.left)
invertTree(root.right)
return root
🏋️ 快速练习
练习1:创建链表
用ListNode类创建链表 1 -> 2 -> 3 -> 4 -> None
点击查看答案
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
# 方法1:逐个创建
node1 = ListNode(1)
node2 = ListNode(2)
node3 = ListNode(3)
node4 = ListNode(4)
node1.next = node2
node2.next = node3
node3.next = node4
# 方法2:链式创建(推荐)
head = ListNode(1, ListNode(2, ListNode(3, ListNode(4))))
# 方法3:从数组创建
def create_list(arr):
dummy = ListNode(0)
current = dummy
for val in arr:
current.next = ListNode(val)
current = current.next
return dummy.next
head = create_list([1, 2, 3, 4])
# 打印链表验证
current = head
while current:
print(current.val, end=" -> ")
current = current.next
print("None")
练习2:计算链表长度
def get_length(head):
# 实现这个函数
pass
# 测试
head = ListNode(1, ListNode(2, ListNode(3)))
print(get_length(head)) # 应该输出3
点击查看答案
def get_length(head):
count = 0
current = head
while current:
count += 1
current = current.next
return count
# 测试
head = ListNode(1, ListNode(2, ListNode(3)))
print(get_length(head)) # 3
练习3:创建二叉树
用TreeNode类创建以下二叉树:
1
/ \
2 3
点击查看答案
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
# 方法1:逐个创建
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
# 方法2:链式创建(推荐)
root = TreeNode(1, TreeNode(2), TreeNode(3))
# 验证:前序遍历
def preorder(root):
if not root:
return
print(root.val, end=" ")
preorder(root.left)
preorder(root.right)
preorder(root) # 1 2 3
🎓 小结
✅ 类定义: class ClassName:
✅ 构造函数: def __init__(self, ...)
✅ self: 代表对象本身
✅ 创建对象: obj = ClassName(args)
✅ 访问属性: obj.attribute
必须记住的两个类:
# 链表节点
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
# 树节点
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
下一步: 16-高级特性.md
掌握节点类,链表和树的题目就能顺利解决! 🚀
如果这篇内容对你有帮助,推荐收藏 AI Compass:https://github.com/tingaicompass/AI-Compass
更多系统化题解、编程基础和 AI 学习资料都在这里,后续复习和拓展会更省时间。

浙公网安备 33010602011771号