二叉树

# tree


class Node(object):
    """二叉树的节点"""

    def __init__(self, item):
        # 记录数据
        self.item = item
        # 记录左孩子
        self.left = None
        # 记录右孩子
        self.right = None


class Tree(object):
    """二叉树"""

    def __init__(self):
        # 记录根节点
        self.__root = None

    def add(self, item):
        """添加节点"""
        new_node = Node(item)
        if self.__root is None:
            self.__root = new_node
            return

        # 从上到下,从左到右遍历,用到队列
        queue = []
        queue.append(self.__root)

        while queue:
            node = queue.pop(0)
            # 判断当前节点,左右有没有子节点
            if node.left is None:
                node.left = new_node
                return
            if node.right is None:
                node.right = new_node
                return
            # 把当前节点的左右子节点添加到队列,将要处理
            queue.append(node.left)
            queue.append(node.right)

    def breath_travel(self):
        """广度优先遍历 从上到下,从左到右遍历,用到队列"""

        if self.__root is None:
            return

        queue = []
        queue.append(self.__root)

        while queue:
            node = queue.pop(0)
            print(node.item, end=" ")

            if node.left is not None:
                queue.append(node.left)
            if node.right is not None:
                queue.append(node.right)
        print()

    def depth_travel(self):
        """深度优先遍历"""

        self.pre_order(self.__root)
        print()
        self.in_order(self.__root)
        print()
        self.post_order(self.__root)
        print()

    def pre_order(self, node):
        """根 左 右"""

        if node is None:
            return
        print(node.item, end=" ")
        self.pre_order(node.left)
        self.pre_order(node.right)

    def in_order(self, node):
        """左 根 右"""

        if node is None:
            return
        self.in_order(node.left)
        print(node.item, end=" ")
        self.in_order(node.right)

    def post_order(self, node):
        """左 右 根"""

        if node is None:
            return
        self.post_order(node.left)
        self.post_order(node.right)
        print(node.item, end=" ")


if __name__ == '__main__':
    tree = Tree()
    tree.add(0)
    tree.add(1)
    tree.add(2)
    tree.add(3)
    tree.add(4)
    tree.add(5)
    tree.add(6)
    tree.add(7)
    tree.add(8)
    tree.add(9)
    tree.breath_travel()
    tree.depth_travel()