二叉树的前、中、后序遍历

78 阅读1分钟

树状图

image.png

核心代码

class Node:
    def __init__(self, x, left=None, right=None):
        self.val = x
        self.left = left
        self.right = right


class PreDfs(object):
    """
    根节点——左子节点——右子节点
    """

    def __init__(self, root: Node):
        self.root = root

    def re_fun(self):
        # [1, 2, 4, 5, 3, 6, 7]
        res = []

        def _fn(node: Node):
            if not node:
                return None
            res.append(node.val)
            _fn(node.left)
            _fn(node.right)

        _fn(self.root)
        return res

    def traverse_fun(self):
        # [1, 2, 4, 5, 3, 6, 7]
        if not self.root:
            return []
        res, stack = [], [self.root]
        while stack:
            node = stack.pop()
            node.right and stack.append(node.right)
            node.left and stack.append(node.left)
            res.append(node.val)
        return res


class MidDfs(object):
    """
    左子树->根节点->右子树
    """

    def __init__(self, root: Node):
        self.root = root

    def re_fun(self):
        # [4, 2, 5, 1, 6, 3, 7]
        res = []

        def _fn(node: Node):
            if not node:
                return None
            _fn(node.left)
            res.append(node.val)
            _fn(node.right)

        _fn(self.root)
        return res

    def traverse_fun(self):
        # [4, 2, 5, 1, 6, 3, 7]
        if not self.root:
            return []
        res, stack = [], []
        p_node = self.root
        while p_node or len(stack) > 0:
            if p_node:
                stack.append(p_node)
                p_node = p_node.left
            else:
                p_node = stack.pop()
                res.append(p_node.val)
                p_node = p_node.right
        return res


class BackDfs(object):
    """
    左子树->右子树->根节点
    """

    def __init__(self, root: Node):
        self.root = root

    def re_func(self):
        # [4, 5, 2, 6, 7, 3, 1]
        res = []

        def _fn(node: Node):
            if not node:
                return None
            _fn(node.left)
            _fn(node.right)
            res.append(node.val)

        _fn(self.root)
        return res

    def traverse_fun(self):
        # [4, 5, 2, 6, 7, 3, 1]
        stack, res = [], []
        while stack or self.root:
            # 下行循环 把每一个左子树遍历完
            while self.root:
                stack.append(self.root)
                # 先左后右
                if self.root.left:
                    self.root = self.root.left
                else:
                    self.root = self.root.right
            n = stack.pop()
            res.append(n.val)
            if stack and n == stack[-1].left:
                # 动态变更根节点
                self.root = stack[-1].right
            else:
                self.root = None
        return res


if __name__ == '__main__':
    r = Node(1, Node(2, Node(4), Node(5)), Node(3, Node(6), Node(7)))
    pd = PreDfs(r)
    print(pd.traverse_fun())
    print(pd.re_fun())
    md = MidDfs(r)
    print(md.re_fun())
    print(md.traverse_fun())
    bd = BackDfs(r)
    print(bd.re_func())
    print(bd.traverse_fun())