Binary Search Trees

Implementing BSTs

Here’s the BST code we saw in class.

class BSTNode:
  def __init__(self, data, parent=None, left=None, right=None):
    self.data = data
    self.parent = parent
    self.left = left
    self.right = right

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

  def add_to(self, node, value):
    if node.data == value:
      return
    elif value < node.data:
      if node.left:
        self.add_to(node.left, value)
      else:
        node.left = BSTNode(value, node)
    else:
      if node.right:
        self.add_to(node.right, value)
      else:
        node.right = BSTNode(value, node)

  def add(self, value):
    if not self.root:
      self.root = BSTNode(value)
    else:
      self.add_to(self.root, value)

  def find_at(self, node, value) -> BSTNode:
    if node.data == value:
      return node
    elif value < node.data and node.left:
      return self.find_at(node.left, value)
    elif value > node.data and node.right:
      return self.find_at(node.right, value)
    return None

  def find(self, value) -> BSTNode:
    if not self.root:
      return None
    return self.find_at(self.root, value)

  def to_list_at(self, node):
    if notq node:
      return []
    return self.to_list_at(node.left) + [node.data] + self.to_list_at(node.right)

  def to_list(self):
    return self.to_list_at(self.root)

Binary search trees: removing nodes

Last time we saw binary search trees, and discussed both (1) searching for a value in the tree and (2) adding a value to the tree. How would we remove a node from the tree? It’s going to depend on the type of node. See the lecture capture for details.