二叉树的遍历(递归与非递归)

class Node:     # 定义树节点
    def __init__(self, value, left=None, right=None):   # 节点的值及左子树、右子树
        self.value = value
        self.left = left
        self.right = right


class Tree:         # 定义二叉树
    def __init__(self, list):
        self.list = list
        self.build_tree()

    def build_tree(self):      # 构建二叉树,从上到下,从左往右
        nodelist = []       # 构建节点列表
        for i in range(len(list)):
            nodelist.append(Node(list[i]))  # 将列表元素添加至节点列表
        self.root = nodelist[0]     # 树的根节点
        for i in range(len(list) // 2): # 遍历节点,构建二叉树
            nodelist[i].left = nodelist[i * 2 + 1]
            if i * 2 + 2 < len(nodelist):
                nodelist[i].right = nodelist[i * 2 + 2]

    def recursive_pre_order(self, nodelist, node):         # 递归前序遍历,输出顺序:父节点,左子树,右子树
        if node is not None:
            nodelist.append(node.value)
            self.recursive_pre_order(nodelist, node.left)
            self.recursive_pre_order(nodelist, node.right)
        return nodelist

    def recursive_in_order(self, nodelist, node):         # 递归中序遍历,输出顺序:左子树,父节点,右子树
        if node is not None:
            self.recursive_in_order(nodelist, node.left)
            nodelist.append(node.value)
            self.recursive_in_order(nodelist, node.right)
        return nodelist

    def recursive_post_order(self, nodelist, node):        # 递归后序遍历,输出顺序:左子树,右子树,父节点
        if node is not None:
            self.recursive_post_order(nodelist, node.left)
            self.recursive_post_order(nodelist, node.right)
            nodelist.append(node.value)
        return nodelist

    @staticmethod
    def not_recursive_pre_order(self, node):         # 非递归前序遍历,输出顺序:父节点,左子树,右子树
        if node is not None:
            stack = [node]  # 将根节点压入栈
            while len(stack) > 0:
                print(node.value, end=" ")
                if node.right is not None:  # 根据栈先进后出的特点,将子节点压栈的时候,先将右子树压入栈
                    stack.append(node.right)
                if node.left is not None:   # 将左子树压入栈
                    stack.append(node.left)
                node = stack.pop()  # 将栈顶元素弹出

    @staticmethod
    def not_recursive_in_order(self, node):         # 非递归中序遍历,输出顺序:左子树,父节点,右子树
        if node is not None:
            stack = []
            temp = node     # 将根节点复制给中间变量
            while temp is not None or len(stack) > 0:
                if temp is not None:
                    stack.append(temp)
                    temp = temp.left    # 中序遍历先遍历节点的左子树
                else:
                    temp = stack.pop()  # 将栈顶元素弹出
                    print(temp.value, end=" ")  # 输出栈顶元素的值
                    temp = temp.right       # 检查右子树

    @staticmethod
    def not_recursive_post_order(self, node):        # 非递归后序遍历,输出顺序:左子树,右子树,父节点
        stack1 = [node]     # 栈 1 遍历二叉树
        stack2 = []     # 栈 2 存储输出顺序
        while len(stack1) > 0:
            node = stack1.pop()
            stack2.append(node)     # 将父节点压入栈底
            if node.left is not None:
                stack1.append(node.left)    # 左子树压入栈
            if node.right is not None:
                stack1.append(node.right)   # 右子树压入栈
        while len(stack2) > 0:
            print(stack2.pop().value, end=" ")  # 输出顺序


if __name__ == '__main__':
    list = [1, 2, 3, 4]
    tree = Tree(list)
    print("递归前序排列")
    retList = tree.recursive_pre_order([], tree.root)
    print(retList)
    print("非递归前序排列")
    tree.not_recursive_pre_order(tree, tree.root)
    print("
递归中序排列")
    retList = tree.recursive_in_order([], tree.root)
    print(retList)
    print("非递归中序排列")
    tree.not_recursive_in_order(tree, tree.root)
    print("
递归后序排列")
    retList = tree.recursive_post_order([], tree.root)
    print(retList)
    print("非递归后序排列")
    tree.not_recursive_post_order(tree, tree.root)

  递归的方法即不断调用自身,非递归采用入栈出栈完成二叉树的遍历

原文地址:https://www.cnblogs.com/soloveu/p/10192579.html