📜  门| GATE-CS-2017(Set 1)|问题17(1)

📅  最后修改于: 2023-12-03 15:28:45.190000             🧑  作者: Mango

GATE-CS-2017(Set 1) | 问题17

问题链接:https://www.geeksforgeeks.org/gate-cs-2017-set-1-question-17/

该问题要求程序员实现一个算法,以对给定的二叉树进行后序遍历。该算法应打印出遍历的结果。

解决方法
算法思路

后序遍历的的遍历顺序为:左子树,右子树,根节点。因此,我们可以使用递归的方法,分别对左子树和右子树进行遍历,然后再打印出根节点。

代码实现

首先,我们需要定义二叉树的节点类:

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

接着,可以实现一个后序遍历函数:

def postorderTraversal(root):
    if not root:
        return []
    stack = [(root, False)]
    res = []
    while stack:
        node, visited = stack.pop()
        if node:
            if visited:
                res.append(node.val)
            else:
                stack.append((node, True))
                stack.append((node.right, False))
                stack.append((node.left, False))
    return res

该函数首先检查输入的根节点是否为 None, 如果是,则立即返回空列表。否则,它会创建一个栈来存储节点。节点对象用一个元组来表示,元组中包含该节点的引用和一个布尔值 visited 来表示该节点是否已被访问。首先将给定的根节点和 False 压入栈中,表示该节点尚未访问。接下来,执行一个循环来遍历栈中的所有节点。

从栈顶元素中取出一个节点,并检查它是否是空。如果节点不为空,则检查它是否被访问。如果节点已访问,则将该节点的值放入结果列表 res 中。如果节点未访问,则将 visited 标志设置为 True,然后将节点右子节点、左子节点和该节点本身按照后序遍历的顺序压入栈中(请注意顺序,因为栈是先进后出的结构)。

最后将结果作为返回值返回。

使用示例
root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.right = Node(4)
root.right.left = Node(5)
postorderTraversal(root)

输出结果为:[4, 2, 5, 3, 1]

总结

本文介绍了如何进行二叉树的后序遍历,并给出了 Python 代码实现。该算法的时间复杂度为 O(n),其中 n 是二叉树中节点的个数,因为每个节点只会被遍历一次。