Maktub_Wiki Maktub_Wiki
主站 (opens new window)
  • 服务搭建
  • 网络服务
  • 开源框架
  • 操作系统
  • iOS/MacOS
  • 算法导论(Python)
  • Leetcode
  • 线性代数
主站 (opens new window)
  • 服务搭建
  • 网络服务
  • 开源框架
  • 操作系统
  • iOS/MacOS
  • 算法导论(Python)
  • Leetcode
  • 线性代数
  • 第2章 算法基础

    • 2.1 插入排序
    • 2.2 算法分析
    • 2.3 设计算法
  • 第6章 堆排序

    • 6.2 维护堆的性质
    • 6.3 建堆
    • 6.4 堆排序算法
    • 6.5 优先队列
  • 第7章 快速排序

    • 7.1 快速排序的描述
  • 第8章 线性时间排序

    • 8.2 计数排序
    • 8.4 桶排序
  • 第12章 二叉树搜索

    • 12.1 什么是二叉树搜索
    • 12.3 插入和删除
      • 插入
        • 代码
      • 删除
        • 伪代码
  • 第13章 红黑树

    • 13.1 红黑树的性质
    • 13.2 旋转
  • 第15章 动态规划

    • 15.4 最长公共子序列
  • 第23章 最小生成树

    • 23.2 Kruskal算法和Prim算法
  • 第24章 单源最短路径

    • 24.1 Bellman-Ford算法
    • 24.3 Dijkstra算法
  • 第25章 所有结点对的最短路径问题

    • 25.2 Floyd-Warshall算法
    • 25.3 用于稀疏图的Johnson算法
  • 第31章 数论算法

    • 31.2 最大公约数
    • 31.6 元素的幂
  • 第32章 字符串匹配

    • 32.4 Knuth-Morris-Pratt算法
  • 算法导论
  • 第12章 二叉树搜索
Maktub_小明
2024-08-15
目录

12.3 插入和删除

# 插入

# 代码

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
def tree_insert(root:TreeNode,z:int):
    z = TreeNode(z)
    x = root
    y = None
    while x:
        y = x
        if z.val < x.val:
            x = x.left
        else:
            x = x.right
    if y == None:
        root == z
    elif z.val < y.val:
        y.left = z
    else:
        y.right = z

# 删除

删除节点z需要考虑四种情况

  1. z只有right,直接right代替
  2. z只有left,直接left代替
  3. z包含left和right,且right节点只有right节点,需要寻找z的后继y,来替换z
  4. 基于第3点,如果后继y是z的right,那直接替换,如果不是,齐腰进行拼接

# 伪代码

def transplant(root:TreeNode,u:TreeNode,v:TreeNode):
    if u.p == None:
        root = v
    elif u == u.p.left:
        u.p.left = v
    else:
        u.p.right = v
    if v != None:
        v.p = u.p

def tree_delete(root:TreeNode,z:TreeNode):
    if z.left == None:
        transplant(root,z,z.right)
    elif z.right == None:
        transplant(root,z,z.left)
    else:
        y = tree_minium(z.right)
        if y.p != z:
            transplant(root,y,y.right)
            y.right = z.right
            y.right.p = y
        transplant(root,z,y)
        y.left = z.left
        y.left.p = y
上次更新: 2025/03/22, 03:52:10
12.1 什么是二叉树搜索
13.1 红黑树的性质

← 12.1 什么是二叉树搜索 13.1 红黑树的性质→

Theme by Vdoing | Copyright © 2021-2025 Maktub_小明 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式