"""Binary Tree Node class for Exercise 5.
Author: Danny Heap, September 2013,
        Francois Pitt, February 2013.
"""


class BTNode(object):
    """A node in a binary tree."""

    def __init__(self, item, left=None, right=None):
        """(BTNode, object, BTNode, BTNode) -> NoneType
        Initialize this node to store item and have children left and right,
        as well as depth 0.
        """
        self.item = item
        self.left = left
        self.right = right
        self.depth = 0  # the depth of this node in a tree

    def __str__(self):
        """(BTNode) -> str
        Return a "sideways" representation of the subtree rooted at this node,
        with right subtrees above parents above left subtrees and each node on
        its own line, preceded by as many TAB characters as the node's depth.
        """
        # If there is a right subtree, add an extra TAB character in front of
        # every node in its string representation, with an extra newline at the
        # end (ready to be concatenated with self.item).
        if self.right:
            str_right = "\t" + str(self.right).replace("\n", "\n\t") + "\n"
        else:
            str_right = ""
        # The string representation of self.item: if item is a string, use
        # repr(item) so that quotes are included and special characters are
        # treated correctly -- just like in a list; else use str(item).
        if isinstance(self.item, str):
            str_item = repr(self.item)
        else:
            str_item = str(self.item)
        # If there is a left subtree, add an extra TAB character in front of
        # every node in its string representation, with an extra newline at the
        # beginning (ready to be concatenated with self.item).
        if self.left:
            str_left = "\n\t" + str(self.left).replace("\n", "\n\t")
        else:
            str_left = ""
        # Put the right subtree above the root above the left subtree.
        return str_right + str_item + str_left
