implemented binary search tree with tests and main demonstraing best and...

... worst case runs
Or, another alternative that tightens up the logic you have here:
        if self.root is None:
                return 0
        return self._depth(1, self.root.left) - self._depth(1, self.root.right)