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 学习资料都在这里,后续复习和拓展会更省时间。

posted @ 2026-04-07 17:18  汀、人工智能  阅读(6)  评论(0)    收藏  举报