算法(③二叉树)

遍历算法

TreeNode 类:

python 复制代码
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

创建节点

python 复制代码
# 创建节点
root = TreeNode(1)
node2 = TreeNode(2)
node3 = TreeNode(3)
node4 = TreeNode(4)
node5 = TreeNode(5)

# 连接节点
root.left = node2
root.right = node3
node2.left = node4
node2.right = node5

前序遍历 (Pre-order Traversal)

python 复制代码
def preorder_traversal(root):
    if root is None:
        return []
    
    result = []
    result.append(root.val)  # 访问根节点
    result.extend(preorder_traversal(root.left)) # 递归访问左子树
    result.extend(preorder_traversal(root.right)) # 递归访问右子树
    
    return result

# 假设我们已经创建了上面那棵树
# preorder_traversal(root) 的结果将是 [1, 2, 4, 5, 3]

中序遍历 (In-order Traversal)

python 复制代码
def inorder_traversal(root):
    if root is None:
        return []
    
    result = []
    result.extend(inorder_traversal(root.left)) # 递归访问左子树
    result.append(root.val)  # 访问根节点
    result.extend(inorder_traversal(root.right)) # 递归访问右子树
    
    return result

# inorder_traversal(root) 的结果将是 [4, 2, 5, 1, 3]

后序遍历 (Post-order Traversal)

python 复制代码
def postorder_traversal(root):
    if root is None:
        return []
    
    result = []
    result.extend(postorder_traversal(root.left)) # 递归访问左子树
    result.extend(postorder_traversal(root.right)) # 递归访问右子树
    result.append(root.val)  # 访问根节点
    
    return result

# postorder_traversal(root) 的结果将是 [4, 5, 2, 3, 1]

二叉搜索树

前置条件:节点类

我们继续使用之前定义的 TreeNode 类:

python 复制代码
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

插入节点 (Insertion)

python 复制代码
def insert_into_bst(root, val):
    """
    在二叉搜索树中插入一个新节点
    :param root: 当前子树的根节点
    :param val: 要插入的值
    :return: 插入新节点后的根节点
    """
    # 递归终止条件:如果当前节点为空,说明找到了插入位置,创建新节点并返回
    if not root:
        return TreeNode(val)

    # 如果要插入的值小于当前节点的值,向左子树递归
    if val < root.val:
        root.left = insert_into_bst(root.left, val)
    # 如果要插入的值大于当前节点的值,向右子树递归
    elif val > root.val:
        root.right = insert_into_bst(root.right, val)

    # 返回当前根节点,因为它的子树可能已经改变
    return root

# 示例:在 BST 中插入 7
# 初始 BST:
#      4
#     / \
#    2   7
#   / \
#  1   3
root = TreeNode(4)
root.left = TreeNode(2, TreeNode(1), TreeNode(3))
root.right = TreeNode(7)

print("插入前的二叉搜索树(前序遍历):", end=" ")
def preorder(node):
    if node:
        print(node.val, end=" ")
        preorder(node.left)
        preorder(node.right)
preorder(root)
print()

root = insert_into_bst(root, 5) # 插入 5

print("插入 5 后的二叉搜索树(前序遍历):", end=" ")
preorder(root)
print()

删除节点 (Deletion)

python 复制代码
def delete_node(root, key):
    """
    在二叉搜索树中删除一个节点
    :param root: 当前子树的根节点
    :param key: 要删除的值
    :return: 删除节点后的根节点
    """
    if not root:
        return root

    # 1. 查找要删除的节点
    if key < root.val:
        root.left = delete_node(root.left, key)
    elif key > root.val:
        root.right = delete_node(root.right, key)
    # 2. 找到要删除的节点(root.val == key)
    else:
        # 情况 1 和 2:节点只有一个子节点或没有子节点
        if not root.left:
            return root.right
        elif not root.right:
            return root.left

        # 情况 3:节点有两个子节点
        # 找到中序遍历的后继节点(右子树中最小的节点)
        temp_node = find_min_node(root.right)
        # 用后继节点的值替换当前节点的值
        root.val = temp_node.val
        # 递归地删除后继节点
        root.right = delete_node(root.right, temp_node.val)

    return root

def find_min_node(node):
    """
    辅助函数:找到子树中的最小节点
    """
    current = node
    while current.left:
        current = current.left
    return current

# 示例:删除节点 4
# 初始 BST:
#      5
#     / \
#    3   6
#   / \   \
#  2   4   7
root = TreeNode(5)
root.left = TreeNode(3, TreeNode(2), TreeNode(4))
root.right = TreeNode(6, None, TreeNode(7))

print("删除 4 前的二叉搜索树(前序遍历):", end=" ")
preorder(root)
print()

root = delete_node(root, 4) # 删除 4

print("删除 4 后的二叉搜索树(前序遍历):", end=" ")
preorder(root)
print()

# 示例:删除节点 5(有两个子节点)
# 初始 BST:
#      5
#     / \
#    3   6
#   / \   \
#  2   4   7
root = TreeNode(5)
root.left = TreeNode(3, TreeNode(2), TreeNode(4))
root.right = TreeNode(6, None, TreeNode(7))

print("删除 5 前的二叉搜索树(前序遍历):", end=" ")
preorder(root)
print()

root = delete_node(root, 5) # 删除 5

print("删除 5 后的二叉搜索树(前序遍历):", end=" ")
preorder(root)
print()

AVL 树

红黑树

平衡二叉树

对称二叉树

树的深度/高度

路径总和

相关推荐
咸鱼爱学习6 小时前
【题解】 [蓝桥杯 2019 省 B] 特别数的和
算法·职场和发展·蓝桥杯·模拟·枚举
lucialeia6 小时前
Leetcode(5)
算法·leetcode
今天也好累6 小时前
贪心算法之分数背包问题
c++·笔记·学习·算法·贪心算法
剪一朵云爱着7 小时前
力扣1878. 矩阵中最大的三个菱形和
算法·leetcode
笙歌已沫7 小时前
蓝桥杯2024年第15届B组试题D
算法·职场和发展·蓝桥杯
一碗白开水一8 小时前
【第30话:路径规划】自动驾驶中Hybrid A星(A*)搜索算法的详细推导及代码示例
人工智能·算法·机器学习·计算机视觉·数学建模·自动驾驶
未来之窗软件服务8 小时前
自己写算法(五)CryptoJS 前端学习——东方仙盟练气期
学习·算法·仙盟创梦ide·东方仙盟·东方仙盟加密
徐小夕9 小时前
pxcharts-vue-max 多维表格编辑器:支持大数据渲染 + 二次开发
前端·vue.js·算法
stjiejieto9 小时前
手机中的轻量化 AI 算法:智能生活的幕后英雄
人工智能·算法·智能手机
纪元A梦10 小时前
贪心算法应用:欧拉路径(Fleury算法)详解
算法·贪心算法