Python Binary Search Tree 二叉搜索树

发布于 2022-02-06 13:18:38 字数 1973 浏览 1028 评论 0

二叉搜索树,也叫二叉查找树(Binary Search Tree,BST),特性是每个结点的值都比左子树大,比右子树小。中序遍历是递增的

实现

find_item(item, root) —— 寻找树中等于某个值的结点,利用 BST 的特性,若一个结点比该值大,则往结点的左边寻找,若一个结点比该值小,则往结点的右边寻找。时间复杂度为 O(log n)

def find_item(item, root):
  if not root:
    return None
  while root:
    if root.val == item:
      return root
    elif root.val > item:
      root = root.left
    else:
      root = root.right
  return None

find_max(root) —— 寻找树中值最大的结点。由于是 BST,最大的结点一定在树的最右边

def find_max(root):
  if not root:
    return None
  while root.right:
    root = root.right
  return root

find_min(root) —— 寻找值最小的结点,一定在树的最左边

def find_min(root):
  if not root:
    return None
  while root.left:
    root = root.left
  return root

add_node(value, root) —— 在二叉搜索树中插入一个新的元素,若元素已存在则忽略

def add_node(value, root):
  if not root:
    return treeNode(value)
  if value > root.val:
    root.right = add_node(value, root.right)  # 递归插入右子树
  elif value < root.val:
    root.left = add_node(value, root.left)  # 递归插入左子树
  else:
    pass  # 如果value已经存在,则什么也不做
  return root

delete_node(value, root) —— 删除一个结点,分三种情况:

  • 要删除的是叶结点:直接删除,将父结点的指针指向 None
  • 要删除的结点只有一个子结点:直接将父结点的指针指向这个子结点
  • 要删除的结点有左、右两个结点(最复杂的情况):选取另一结点代替被删结点——右子树的最小元素或左子树的最大元素。可以看到,右子树的最小元素或左子树的最大元素都是最多只有一个子结点,因此对它们的删除操作也很简单
def delete_node(value, root):
  if not root:
    return None  # 说明要删除的元素未找到
  if value < root.val:
    root.left = delete_node(value, root.left)  # 左子树递归删除
  elif value > root.val:
    root.right = delete_node(value, root.right)  # 右子树递归删除
  else:  # 说明已经找到要删除的结点了
    if not root.left:  # 只有右子树或者没有子结点
      return root.right
    elif not root.right:  # 只有左子树
      return root.left
    else:  # 有左右两个结点
      temp = find_min(root.right)  # 在右子树中找到最小的元素
      root.val = temp.val
      root.right = delete_node(temp.val, root.right)
  return root

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84959 人气
更多

推荐作者

lioqio

文章 0 评论 0

Single

文章 0 评论 0

禾厶谷欠

文章 0 评论 0

alipaysp_2zg8elfGgC

文章 0 评论 0

qq_N6d4X7

文章 0 评论 0

放低过去

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文