返回

二叉树与二叉搜索树:解题指南

前端

在数据结构领域,树结构是一种非线性数据结构,其中数据项以层次结构组织,类似于一棵树。本文将深入探讨两种重要的树结构:二叉树和二叉搜索树。我们将了解它们的性质、操作和在现实世界中的应用。

二叉树

二叉树是一种树结构,其中每个节点最多有两个子节点,即左子节点和右子节点。二叉树的特殊之处在于它的不对称性,这使得它适合于表示层次数据。

特性:

  • 每个节点最多有两个子节点。
  • 每个节点都有一个唯一的前驱节点(即父节点)。
  • 每个节点都有零个或多个后继节点(即子节点)。

二叉搜索树

二叉搜索树(BST)是一种特殊的二叉树,它遵循以下规则:

  • 对于每个节点,左子树中的所有元素都小于该节点的值。
  • 对于每个节点,右子树中的所有元素都大于该节点的值。

特性:

  • 二叉搜索树的特性使之适用于快速搜索和检索数据。
  • 节点的键(值)用于与树中的其他节点进行比较。
  • BST的平均时间复杂度为O(log n),其中n是树中的节点数。

操作

二叉树和二叉搜索树支持以下常见操作:

  • 插入: 在树中插入一个新的节点。
  • 删除: 从树中删除一个现有的节点。
  • 搜索: 根据键在树中查找一个节点。
  • 遍历: 以不同的顺序访问树中的节点,如前序遍历、中序遍历和后序遍历。

应用

二叉树和二叉搜索树广泛应用于各种领域,包括:

  • 文件系统
  • 数据库索引
  • 路由算法
  • 游戏引擎
  • 人工智能

刷题打卡

LeetCode 98

验证二叉搜索树

题目:

给定一个二叉树,判断其是否是一棵二叉搜索树。

解法:

使用中序遍历,并检查遍历结果是否是一个递增序列。

def isValidBST(root):
    prev = None

    def inorder(root):
        if not root:
            return True

        if not inorder(root.left):
            return False

        if prev and root.val <= prev.val:
            return False

        prev = root

        return inorder(root.right)

    return inorder(root)

LeetCode 104

二叉树的最大深度

题目:

给定一棵二叉树,求其最大深度。

解法:

使用深度优先搜索(DFS),计算每个节点的深度,并取最大值。

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

LeetCode 112

路径总和

题目:

给定一棵二叉树和一个目标和,判断是否存在从根节点到叶子节点的路径,其和等于目标和。

解法:

使用深度优先搜索,在每个节点检查路径和,如果路径和等于目标和,则返回True。

def hasPathSum(root, target_sum):
    if not root:
        return False

    if not root.left and not root.right and root.val == target_sum:
        return True

    return hasPathSum(root.left, target_sum - root.val) or hasPathSum(root.right, target_sum - root.val)