#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# author: bigfoolliu


"""

深度优先遍历

使用颜色标记法对二叉树进行遍历，使用迭代的方式

0: 未访问
1: 已访问
"""

import binary_tree
import sys
import os

sys.path.insert(0, os.path.abspath(__file__))


def color_preorder_traversal(root):
    """
    先序遍历
    根--左--右
    """
    VISITED, NOT_VISITED = 1, 0
    if not root:
        return []
    res = []
    stack = [(NOT_VISITED, root)]
    while stack:
        if_visited, node = stack.pop()  # 第一个弹出来的
        if node is None:
            continue
        if if_visited == NOT_VISITED:  # 如果该节点未被访问
            # 三个节点的入栈操作, 将 根--左--右倒过来入栈顺序为 右--左--根
            stack.append((NOT_VISITED, node.right))
            stack.append((NOT_VISITED, node.left))
            stack.append((VISITED, node))
        else:
            res.append(node.data)
    return res


def color_inorder_traversal(root):
    """
    中序遍历
    左--中--右
    """
    if not root:
        return []
    # WHITE, GRAY = 0, 1
    res = []
    stack = [(0, root)]  # 新节点
    while stack:
        color, node = stack.pop()  # 弹出尾节点
        if node is None:
            continue
        if color == 0:  # 如果是新节点
            # 三个节点的入栈操作，将 左--中--右 的顺序倒过来为入栈 右--中--左
            stack.append((0, node.right))  # 新节点，注意入栈的时候先让右节点入，这样出栈的时候则其先出
            stack.append((1, node))  # 已访问的节点
            stack.append((0, node.left))  # 新节点
        else:  # 如果是访问过的节点
            res.append(node.data)
    return res


def color_postorder_traversal(root):
    """
    后序遍历
    左--右--中
    """
    if not root:
        return []
    res = []
    stack = [(0, root)]
    while stack:
        color, node = stack.pop()
        if node is None:
            continue
        if color == 0:
            stack.append((1, node))
            stack.append((0, node.right))
            stack.append((0, node.left))
        else:
            res.append(node.data)
    return res


def main():
    root = binary_tree.create_binary_tree([0, 1, 2, 3, 4])
    print(root.data)

    res1 = color_preorder_traversal(root)
    print(f'pre color: {res1}')

    res2 = color_inorder_traversal(root)
    print(f'in color: {res2}')

    res3 = color_postorder_traversal(root)
    print(f'post color: {res3}')


if __name__ == '__main__':
    main()

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# author: bigfoolliu


"""

深度优先遍历

使用颜色标记法对二叉树进行遍历，使用迭代的方式

0: 未访问
1: 已访问
"""

import binary_tree
import sys
import os

sys.path.insert(0, os.path.abspath(__file__))


def color_preorder_traversal(root):
    """
    先序遍历
    根--左--右
    """
    VISITED, NOT_VISITED = 1, 0
    if not root:
        return []
    res = []
    stack = [(NOT_VISITED, root)]
    while stack:
        if_visited, node = stack.pop()  # 第一个弹出来的
        if node is None:
            continue
        if if_visited == NOT_VISITED:  # 如果该节点未被访问
            # 三个节点的入栈操作, 将 根--左--右倒过来入栈顺序为 右--左--根
            stack.append((NOT_VISITED, node.right))
            stack.append((NOT_VISITED, node.left))
            stack.append((VISITED, node))
        else:
            res.append(node.data)
    return res


def color_inorder_traversal(root):
    """
    中序遍历
    左--中--右
    """
    if not root:
        return []
    # WHITE, GRAY = 0, 1
    res = []
    stack = [(0, root)]  # 新节点
    while stack:
        color, node = stack.pop()  # 弹出尾节点
        if node is None:
            continue
        if color == 0:  # 如果是新节点
            # 三个节点的入栈操作，将 左--中--右 的顺序倒过来为入栈 右--中--左
            stack.append((0, node.right))  # 新节点，注意入栈的时候先让右节点入，这样出栈的时候则其先出
            stack.append((1, node))  # 已访问的节点
            stack.append((0, node.left))  # 新节点
        else:  # 如果是访问过的节点
            res.append(node.data)
    return res


def color_postorder_traversal(root):
    """
    后序遍历
    左--右--中
    """
    if not root:
        return []
    res = []
    stack = [(0, root)]
    while stack:
        color, node = stack.pop()
        if node is None:
            continue
        if color == 0:
            stack.append((1, node))
            stack.append((0, node.right))
            stack.append((0, node.left))
        else:
            res.append(node.data)
    return res


def main():
    root = binary_tree.create_binary_tree([0, 1, 2, 3, 4])
    print(root.data)

    res1 = color_preorder_traversal(root)
    print(f'pre color: {res1}')

    res2 = color_inorder_traversal(root)
    print(f'in color: {res2}')

    res3 = color_postorder_traversal(root)
    print(f'post color: {res3}')


if __name__ == '__main__':
    main()

#!/usr/bin/env python3 # -*- coding:utf-8 -*- # author: bigfoolliu 深度优先遍历  使用颜色标记法对二叉树进行遍历，使用迭代的方式  0: 未访问 1: 已访问 先序遍历     根--左--右 # 第一个弹出来的 # 如果该节点未被访问 # 三个节点的入栈操作, 将 根--左--右倒过来入栈顺序为 右--左--根 中序遍历     左--中--右 # WHITE, GRAY = 0, 1 # 新节点 # 弹出尾节点 # 如果是新节点 # 三个节点的入栈操作，将 左--中--右 的顺序倒过来为入栈 右--中--左 # 新节点，注意入栈的时候先让右节点入，这样出栈的时候则其先出 # 已访问的节点 # 新节点 # 如果是访问过的节点 后序遍历     左--右--中