AI刷题之二叉树 | 豆包MarsCode AI刷题

101 阅读3分钟

AI刷题之二叉树

在AI刷题中,图论是不可忽视的知识点,在刷题的大家一定也或多或少刷到了二叉树的题。

在刷题时,如果碰到瓶颈,可以使用屏幕右边的AI代码陪练来帮自己解决问题,体验很不错:

image.png

一、什么是二叉树

二叉树是一种树形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树在计算机科学中应用广泛,比如搜索、排序和表达式解析。

1.基本概念

  • 根节点 (Root) :树的最顶层节点。
  • 子节点 (Child) :一个节点连接的下级节点。
  • 父节点 (Parent) :一个节点连接的上级节点。
  • 叶子节点 (Leaf) :没有子节点的节点。
  • 高度 (Height) :从根节点到叶子节点的最长路径。
  • 深度 (Depth) :从根节点到某节点的路径长度。
  • 完全二叉树:除了最后一层节点,所有层都是满的,且最后一层的节点从左到右连续排列。
  • 满二叉树:所有节点都有两个子节点。
  • 二叉搜索树 (Binary Search Tree, BST) :左子节点小于父节点,右子节点大于父节点。
  • 普通二叉树
    任意结构的二叉树,只需满足每个节点最多有两个子节点。

二、二叉树的python表示

1. 节点类的定义

每个节点包含数据、左子节点和右子节点。

class TreeNode:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None

2. 创建二叉树

我们可以通过创建多个 TreeNode 实例,手动链接它们来构建二叉树。

# 创建节点
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)

# 现在二叉树的结构为:
#        1
#       / \
#      2   3
#     / \
#    4   5

3.二叉树的遍历

遍历是访问二叉树中所有节点的一种方法。常见的遍历方式有:

  • 前序遍历 (Pre-order) :根节点 → 左子树 → 右子树

它的递归实现逻辑非常直观,每到一个节点时,先处理当前节点,再递归处理左子树和右子树。

  • 中序遍历 (In-order) :左子树 → 根节点 → 右子树

中序遍历的结果对于二叉搜索树非常重要,它会按照节点值的递增顺序访问所有节点。

  • 后序遍历 (Post-order) :左子树 → 右子树 → 根节点

这种方式在需要先处理子问题再处理当前节点的问题中很有用,比如删除整棵树或计算树的高度。

  • 层次遍历 (Level-order) :按层从上到下,从左到右访问节点。

需要借助队列来实现,因为队列是先进先出的数据结构,正好符合层次遍历的需求。

(1) 前序遍历
def preorder_traversal(node):
    if node is not None:
        print(node.value, end=' ')
        preorder_traversal(node.left)
        preorder_traversal(node.right)
(2) 中序遍历
def inorder_traversal(node):
    if node is not None:
        inorder_traversal(node.left)
        print(node.value, end=' ')
        inorder_traversal(node.right)
(3) 后序遍历
def postorder_traversal(node):
    if node is not None:
        postorder_traversal(node.left)
        postorder_traversal(node.right)
        print(node.value, end=' ')
(4) 层次遍历

层次遍历需要借助队列(FIFO)结构。

from collections import deque

def level_order_traversal(root):
    if not root:
        return
    queue = deque([root])
    while queue:
        node = queue.popleft()
        print(node.value, end=' ')
        if node.left:
            queue.append(node.left)
        if node.right:
            queue.append(node.right)

三、 二叉树的常见应用

二叉树是一种特殊的树形结构,它的每个节点最多只能有两个子节点,分别称为左子节点和右子节点。这种结构使得二叉树非常适合递归处理,同时也在许多计算机科学领域有广泛的应用,比如:

  • 表达式树:用于解析数学表达式。
  • 霍夫曼树:用于数据压缩。
  • 优先队列:基于堆实现的优先队列。
  • 文件目录结构:操作系统中的文件系统。