📜  数据结构和算法-树遍历(1)

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

数据结构和算法 - 树遍历

什么是树?

树是一种数据结构,其中每个节点都有零个或多个子节点。树的节点连接起来的结构类似于树的分支结构,因此而得名。树的顶部节点称为根节点,没有子节点的节点称为叶子节点。

树的遍历

树的遍历是指按照某种顺序访问树中的所有节点。树的遍历可以分为三种方式:

  1. 前序遍历
  2. 中序遍历
  3. 后序遍历

以下代码演示了如何在 Python 中实现树的遍历:

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

def preorderTraversal(root: TreeNode) -> List[int]:
    if root is None:
        return []
    result = []
    stack = [root]
    while stack:
        node = stack.pop()
        if node is not None:
            result.append(node.val)
            stack.append(node.right)
            stack.append(node.left)
    return result

def inorderTraversal(root: TreeNode) -> List[int]:
    if root is None:
        return []
    result = []
    stack = []
    node = root
    while stack or node is not None:
        if node is not None:
            stack.append(node)
            node = node.left
        else:
            node = stack.pop()
            result.append(node.val)
            node = node.right
    return result

def postorderTraversal(root: TreeNode) -> List[int]:
    if root is None:
        return []
    result = []
    stack = [root]
    while stack:
        node = stack.pop()
        if node is not None:
            result.append(node.val)
            stack.append(node.left)
            stack.append(node.right)
    return result[::-1]
前序遍历

前序遍历是指先访问根节点,然后遍历左子树,最后遍历右子树的遍历方式。

以下是前序遍历的流程图:

前序遍历流程图

以下是前序遍历的例子:

# 示例:
#   1
#  / \
# 2   3
#    / \
#   4   5

root = TreeNode(1, TreeNode(2), TreeNode(3, TreeNode(4), TreeNode(5)))
assert preorderTraversal(root) == [1, 2, 3, 4, 5]
中序遍历

中序遍历是指先遍历左子树,再访问根节点,最后遍历右子树的遍历方式。

以下是中序遍历的流程图:

中序遍历流程图

以下是中序遍历的例子:

# 示例:
#   1
#  / \
# 2   3
#    / \
#   4   5

root = TreeNode(1, TreeNode(2), TreeNode(3, TreeNode(4), TreeNode(5)))
assert inorderTraversal(root) == [2, 1, 4, 3, 5]
后序遍历

后序遍历是指先遍历左子树,再遍历右子树,最后访问根节点的遍历方式。

以下是后序遍历的流程图:

后序遍历流程图

以下是后序遍历的例子:

# 示例:
#   1
#  / \
# 2   3
#    / \
#   4   5

root = TreeNode(1, TreeNode(2), TreeNode(3, TreeNode(4), TreeNode(5)))
assert postorderTraversal(root) == [2, 4, 5, 3, 1]
总结

树的遍历是树相关问题中,最常见的一种问题。熟练掌握树的遍历算法,对于解决树相关问题非常重要。