N叉树的三种遍历(层次遍历、前序遍历、后序遍历)

N叉树是一种特殊的树形结构,它的每个节点可以拥有多个子节点。在对N叉树进行遍历时,有三种常用的遍历方式:层次遍历、前序遍历和后序遍历。

层次遍历

层次遍历是一种逐层遍历整棵N叉树的方法,它是通过队列实现的。可以采用BFS算法(广度优先遍历)将每一层的节点先全部入队列,然后依次出队列并输出。

示例1:

对于如下的一棵简单的N叉树,进行层次遍历:

    1
   /|\ \
  2 3  4 5

层次遍历的输出应该是 1 2 3 4 5

示例2:

对于如下的一棵稍微复杂一些的 4 叉 N 叉树,进行层次遍历:

        1
   / / | \ \
  2 3  4  5 6
 / \    |   /
7   8   9 10

层次遍历的输出应该是 1 2 3 4 5 6 7 8 9 10

具体实现见下文代码块。

前序遍历

前序遍历的方式是遍历整棵N叉树的节点,并将节点的值依次输出。遍历顺序为根节点 -> 左子树 -> 右子树。

示例3:

对于如下一棵 N 叉树,进行前序遍历:

      1
    / | \
   3  2  4
  / \
 5   6

前序遍历的输出应该是 1 3 5 6 2 4

具体实现见下文代码块。

后序遍历

后序遍历是深度优先遍历 N 叉树的一种策略,遍历顺序为左子树 -> 右子树 -> 根节点。

示例4:

对于如下的一棵 N 叉树,进行后序遍历:

      1
   / / \ \
  2 3  4  5
    |     |
    6     7

后序遍历的输出应该是 2 6 3 4 7 5 1

具体实现见下文代码块。

示例代码

"""
定义 N 叉树的类 Node 和遍历的函数,包括层次遍历,前序遍历和后序遍历。
"""

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

def levelOrder(root):
    """
    层次遍历函数,使用队列实现。
    """
    if not root:
        return []
    res, queue = [], [root]
    while queue:
        level = []
        for _ in range(len(queue)):
            node = queue.pop(0)
            level.append(node.val)
            queue.extend(node.children)
        res.append(level)
    return res

def preorder(root):
    """
    前序遍历函数,使用递归实现。
    """
    def dfs(node):
        nonlocal res
        if not node:
            return
        res.append(node.val)
        for child in node.children:
            dfs(child)
    res = []
    dfs(root)
    return res

def postorder(root):
    """
    后序遍历函数,使用递归实现。
    """
    def dfs(node):
        nonlocal res
        if not node:
            return
        for child in node.children:
            dfs(child)
        res.append(node.val)
    res = []
    dfs(root)
    return res

# 示例1
node5 = Node(5)
node4 = Node(4)
node3 = Node(3)
node2 = Node(2)
root = Node(1, [node2, node3, node4, node5])
assert levelOrder(root) == [[1], [2, 3, 4], [5]]
assert preorder(root) == [1, 2, 3, 5, 4]
assert postorder(root) == [5, 2, 3, 4, 1]

# 示例2
node10 = Node(10)
node9 = Node(9)
node8 = Node(8)
node7 = Node(7)
node6 = Node(6, [node10])
node5 = Node(5)
node4 = Node(4, [node9])
node3 = Node(3, [node7, node8])
node2 = Node(2, [node5, node6])
root = Node(1, [node2, node3, node4])
node5.children.append(node7)
assert levelOrder(root) == [[1], [2, 3, 4], [5, 6, 7, 8, 9], [10]]
assert preorder(root) == [1, 2, 5, 6, 10, 3, 7, 8, 4, 9]
assert postorder(root) == [10, 6, 5, 7, 8, 3, 9, 4, 1]

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:N叉树的三种遍历(层次遍历、前序遍历、后序遍历) - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 《用python玩转数据》项目—线性回归分析入门之波士顿房价…

    《用Python玩转数据》项目—线性回归分析入门之波士顿房价预测 在数据分析和机器学习领域中,线性回归分析是最基本的模型之一。它能够通过对已知数据进行学习,来预测新的数据。在这篇文章中,我们将使用Python来构建一个线性回归模型,来预测波士顿地区的房价。 数据的获取与处理 首先,我们需要获取数据。这里我们将使用sklearn中的波士顿房价数据集。数据集已经…

    其他 2023年3月28日
    00
  • Python 继承,重写,super()调用父类方法操作示例

    Python继承是指子类继承父类的属性和方法,可以在不影响父类功能的情况下,对子类进行扩展。Python中使用关键字class定义类,使用extends关键字来继承父类。下面演示一个简单的继承示例: class Person: def __init__(self, name, age): self.name = name self.age = age def…

    other 2023年6月27日
    00
  • Linux程序运行时加载动态库失败的解决方法

    让我来详细讲解一下“Linux程序运行时加载动态库失败的解决方法”的完整攻略。 问题描述 在Linux系统中,我们经常会遇到在运行程序时无法加载动态库的情况。这可能会导致程序无法正常运行,特别是在涉及到第三方库的情况下。如何解决这个问题呢?下面将提供一些可能的解决方法。 解决方法一:添加动态库搜索路径 在Linux系统中,系统会默认在一些预设的目录中搜索动态…

    other 2023年6月27日
    00
  • C++深入探究重载重写覆盖的区别

    C++深入探究重载、重写、覆盖的区别 在C++中,有三种不同的函数使用方法:重载(Overloading)、重写(Overriding)和覆盖(Hiding)。虽然它们有些相似之处,但它们各自有不同的用途和行为。以下是它们的详细解释。 重载(Overloading) 重载是指定义多个具有相同名称(函数名)但不同参数列表(参数类型、参数个数或参数顺序)的函数。…

    other 2023年6月26日
    00
  • vue组件库的基本开发步骤

    Vue组件库的基本开发步骤 Vue组件库是为Vue开发者提供方便的解决方案,可以加速Vue应用程序的开发,提高软件开发效率。本文将介绍Vue组件库的基本开发步骤。 第一步:创建Vue组件 首先,我们需要创建一个Vue组件。一个Vue组件可以包括HTML、CSS和JavaScript代码。我们可以使用Vue CLI(命令行界面)工具来创建Vue组件。在命令行中…

    其他 2023年3月28日
    00
  • c语言中scanf的基本用法

    下面是关于C语言中scanf的完整攻略: 一、scanf函数介绍 scanf是C语言中的一个函数,其作用是从标准输入流中读取用户的输入,然后将其以指定的格式进行转换。scanf函数的定义在头文件stdio.h中,其具有以下格式: int scanf(const char *format, …); 其第一个参数format是一个字符串常量,用于表示读取输入…

    other 2023年6月27日
    00
  • python 内置错误类型 Built-in Exceptions

    Python 内置错误类型 Built-in Exceptions 在 Python 中,错误类型被定义为异常。每个异常都是一个类,这些类都是内置到 Python 中的。在程序执行过程中,当 Python 遇到错误时会自动抛出相应的异常。 以下是 Python 内置的一些常见异常及其描述: 1. Exception(所有异常的基类) 在 Python 中,所…

    其他 2023年3月28日
    00
  • iPhone自带键盘的正确打开方式 iPhone11隐藏的输入法技巧

    iPhone自带键盘的正确打开方式 在iPhone上,自带的键盘是我们日常使用最频繁的工具之一。了解如何正确打开iPhone自带键盘以及掌握一些隐藏的输入法技巧,可以提高我们的输入效率和用户体验。下面是一个完整的攻略,包含了两个示例说明。 步骤一:打开iPhone自带键盘 在iPhone主屏幕上找到并点击“设置”图标。 在设置界面中,向下滑动并点击“通用”选…

    other 2023年8月5日
    00
合作推广
合作推广
分享本页
返回顶部