dsa.pretty_print API documentation
Description: Module to access functions for a clearer visual representation of certain data structures.

# Module `dsa.pretty_print`

Module to access functions for a clearer visual representation of certain data structures.

Expand source code

    """ Module to access functions for a clearer visual representation of certain data structures. """
    import math

    def heap_print(heap):
        """
        Print a heap from root to leaves.

        Args:
            heap: The heap object to print.
        """
        if not heap or heap.count() == 0:
            return

        _array_print(heap.count(), heap.enumerate())

    def _array_print(node_count, enum_sequence):
        """
        Print a heap from root to leaves.

        Args:
            heap: The heap object to print.
        """
        height = math.floor(math.log2(node_count))
        level_str = ""
        current_level = 0
        value_width = 3
        max_width = 2 ** (height - 1) * value_width

        for index, node in enum_sequence:
            level = int(math.log2(index + 1))
            columns = 2 ** (level - 1)
            column_width = int(max_width / columns)
            if current_level != level:
                current_level = level
                print(level_str)
                level_str = ""
            level_str += f"{node:^{column_width}}"
        print(level_str)
        print()

    def tree_to_array(node, index: int=0, tree_array=None):
        """
        (helper function) Create an array filled with index and value pairs from a node based tree.

        Args:
            node: The starting node.
            index (int): The starting index.
            tree_array: The destination array.

        Returns:
            Array filled with tree values.
        """
        if not tree_array:
            tree_array = []
        if node is None:
            return
        tree_array.append((index, node.value))
        tree_to_array(node.left, index * 2 + 1, tree_array)
        tree_to_array(node.right, index * 2 + 2, tree_array)

        return tree_array

    def get_tree_height(node) -> int:
        """
        (helper function) Calculate the height of a tree.

        Args:
            node: The starting node.

        Returns:
            The height of a tree.
        """
        if node is None:
            return 0
        else:
            return max(get_tree_height(node.left) + 1, get_tree_height(node.right) + 1)

    def fill_complete_tree(tree):
        """
        (helper function) Force a binary tree to be a complete tree by filling any empty nodes.

        Args:
            tree: The tree to fill.

        Returns:
            A new tree that is complete.
        """
        if tree is None:
            return None

        tree_array = tree_to_array(tree.root)
        if tree_array is None:
            return

        tree_height = get_tree_height(tree.root)

        # build empty complete tree
        array_size = (2 ** tree_height) - 1
        new_tree = [ "" ] * array_size

        # fill the complete tree array
        for index, value in tree_array:
            new_tree[index] = value
        return new_tree

    def tree_print(tree):
        """
        Print a tree from root to leaves.

        Args:
            tree: The tree object to print.

        Notes:
            Reuses heap_print() by converting tree into a complete tree array.
        """
        complete_tree = fill_complete_tree(tree)
        if complete_tree:
            _array_print(len(complete_tree), enumerate(complete_tree))

## Functions

`def fill_complete_tree(tree)`

  (helper function) Force a binary tree to be a complete tree by filling any empty nodes.

  ## Args

  `tree`
    The tree to fill.

  ## Returns

  A new tree that is complete.

  Expand source code

      def fill_complete_tree(tree):
          """
          (helper function) Force a binary tree to be a complete tree by filling any empty nodes.

          Args:
              tree: The tree to fill.

          Returns:
              A new tree that is complete.
          """
          if tree is None:
              return None

          tree_array = tree_to_array(tree.root)
          if tree_array is None:
              return

          tree_height = get_tree_height(tree.root)

          # build empty complete tree
          array_size = (2 ** tree_height) - 1
          new_tree = [ "" ] * array_size

          # fill the complete tree array
          for index, value in tree_array:
              new_tree[index] = value
          return new_tree

`def get_tree_height(node) ‑> int`

  (helper function) Calculate the height of a tree.

  ## Args

  `node`
    The starting node.

  ## Returns

  The height of a tree.

  Expand source code

      def get_tree_height(node) -> int:
          """
          (helper function) Calculate the height of a tree.

          Args:
              node: The starting node.

          Returns:
              The height of a tree.
          """
          if node is None:
              return 0
          else:
              return max(get_tree_height(node.left) + 1, get_tree_height(node.right) + 1)

`def heap_print(heap)`

  Print a heap from root to leaves.

  ## Args

  `heap`
    The heap object to print.
  Expand source code

      def heap_print(heap):
          """
          Print a heap from root to leaves.

          Args:
              heap: The heap object to print.
          """
          if not heap or heap.count() == 0:
              return

          _array_print(heap.count(), heap.enumerate())

`def tree_print(tree)`

  Print a tree from root to leaves.

  ## Args

  `tree`
    The tree object to print.

  ## Notes

  Reuses heap_print() by converting tree into a complete tree array.

  Expand source code

      def tree_print(tree):
          """
          Print a tree from root to leaves.

          Args:
              tree: The tree object to print.

          Notes:
              Reuses heap_print() by converting tree into a complete tree array.
          """
          complete_tree = fill_complete_tree(tree)
          if complete_tree:
              _array_print(len(complete_tree), enumerate(complete_tree))

`def tree_to_array(node, index: int = 0, tree_array=None)`

  (helper function) Create an array filled with index and value pairs from a node based tree.

  ## Args

  `node`
    The starting node.
  `index` :`int`
    The starting index.
  `tree_array`
    The destination array.

  ## Returns

  Array filled with tree values.

  Expand source code

      def tree_to_array(node, index: int=0, tree_array=None):
          """
          (helper function) Create an array filled with index and value pairs from a node based tree.

          Args:
              node: The starting node.
              index (int): The starting index.
              tree_array: The destination array.

          Returns:
              Array filled with tree values.
          """
          if not tree_array:
              tree_array = []
          if node is None:
              return
          tree_array.append((index, node.value))
          tree_to_array(node.left, index * 2 + 1, tree_array)
          tree_to_array(node.right, index * 2 + 2, tree_array)

          return tree_array