返回

追寻二叉搜索树的足迹:揭开平衡有序的奥秘

前端

二叉搜索树的定义

二叉搜索树(BST)是一种特殊的二叉树,它具有以下性质:

  • 对于树中的任意节点,其左子节点的值都小于该节点的值。
  • 对于树中的任意节点,其右子节点的值都大于该节点的值。

二叉搜索树的这些性质使其在查找、插入和删除操作上都具有较高的效率。

二叉搜索树的实现

二叉搜索树的实现有很多种,常见的方式有使用数组或者链表。为了便于理解,我们使用数组来实现一个二叉搜索树。

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

class BinarySearchTree:
  def __init__(self):
    self.root = None

  def insert(self, value):
    new_node = Node(value)
    if self.root is None:
      self.root = new_node
      return

    self._insert(new_node, self.root)

  def _insert(self, new_node, current_node):
    if new_node.value < current_node.value:
      if current_node.left is None:
        current_node.left = new_node
      else:
        self._insert(new_node, current_node.left)
    else:
      if current_node.right is None:
        current_node.right = new_node
      else:
        self._insert(new_node, current_node.right)

  def search(self, value):
    return self._search(value, self.root)

  def _search(self, value, current_node):
    if current_node is None:
      return False

    if current_node.value == value:
      return True

    if value < current_node.value:
      return self._search(value, current_node.left)
    else:
      return self._search(value, current_node.right)

  def delete(self, value):
    self._delete(value, self.root)

  def _delete(self, value, current_node):
    if current_node is None:
      return

    if value < current_node.value:
      self._delete(value, current_node.left)
    elif value > current_node.value:
      self._delete(value, current_node.right)
    else:
      if current_node.left is None:
        current_node = current_node.right
      elif current_node.right is None:
        current_node = current_node.left
      else:
        successor = self._find_successor(current_node)
        current_node.value = successor.value
        self._delete(successor.value, current_node.right)

  def _find_successor(self, current_node):
    current_node = current_node.right
    while current_node.left is not None:
      current_node = current_node.left
    return current_node

  def print_tree(self):
    self._print_tree(self.root)

  def _print_tree(self, current_node):
    if current_node is None:
      return

    print(current_node.value)
    self._print_tree(current_node.left)
    self._print_tree(current_node.right)

判断一棵二叉树是否为有效的二叉搜索树

判断一棵二叉树是否为有效的二叉搜索树,可以采用中序遍历的方式。中序遍历的顺序是:左子树、根节点、右子树。对于一颗有效的二叉搜索树,其中序遍历的结果应该是一个有序序列。

def is_valid_bst(root):
  values = []
  inorder_traversal(root, values)
  for i in range(1, len(values)):
    if values[i] <= values[i-1]:
      return False
  return True

def inorder_traversal(root, values):
  if root is None:
    return

  inorder_traversal(root.left, values)
  values.append(root.value)
  inorder_traversal(root.right, values)

结语

二叉搜索树作为一种重要的数据结构,在计算机科学领域有着广泛的应用。它不仅具有较高的查询、插入和删除效率,而且还易于维护。本文对二叉搜索树的定义、性质和实现进行了详细的介绍,并提供了一个实用的算法来判断一棵二叉树是否为有效的二叉搜索树。希望本文能够帮助读者更好地理解和掌握二叉搜索树。