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日

相关文章

  • Android Jni的简单使用详解

    Android Jni的简单使用详解 JNI(Java Native Interface)是Java提供的一种机制,用于实现Java与其他编程语言(如C/C++)之间的交互。在Android开发中,JNI常用于调用底层的C/C++代码,以实现一些高性能、底层操作的功能。 1. 准备工作 在Android项目中使用JNI,需要进行以下准备工作: 创建一个jni…

    other 2023年10月13日
    00
  • JavaScript设计模式之构造器模式(生成器模式)定义与用法实例分析

    JavaScript设计模式之构造器模式(生成器模式)定义与用法实例分析 什么是构造器模式? 构造器模式,也叫做生成器模式(Builder Pattern),是一种对象创建型模式。在构造器模式中,我们可以定义一个独立的建造者(Builder)对象,该对象封装了创建复杂对象的过程,并允许对象逐步构建。主要思想是将“建造产品的过程”与“细节”分离开来。 举个例子…

    other 2023年6月26日
    00
  • Android之Spinner用法详解

    Android之Spinner用法详解 Spinner是Android中常用的下拉选择框控件,可以用于展示一组选项供用户选择。本攻略将详细讲解Spinner的用法,并提供两个示例说明。 1. 基本用法 首先,在XML布局文件中添加Spinner控件: <Spinner android:id=\"@+id/spinner\" andr…

    other 2023年9月6日
    00
  • React框架 dva 和 mobx 的使用感受

    React框架 dva 和 mobx 的使用感受 React 是目前前端开发中最流行的框架之一,而 dva 和 mobx 则是在 React 生态系统中非常受欢迎的状态管理工具。在实际项目中,我们尝试使用了 dva 和 mobx 两种框架,并在使用过程中有一些收获和感受。 dva 框架的使用感受 dva 是一个基于 React 和 Redux 的 web 应…

    其他 2023年3月28日
    00
  • sai怎么自制笔刷? sai制作独一无二的笔画的教程

    下面是详细讲解如何在SAI中自制笔刷的教程: 如何自制笔刷 在SAI软件中,我们可以通过自定义笔刷(以下简称“自制笔刷”)来制作独特的笔画。具体步骤如下: 步骤1:打开SAI软件并进入钢笔工具 对于初学者或者新手,建议先熟悉SAI的各种基本工具,特别是钢笔工具,这是自制笔刷的基础。当你进入SAI软件后,单击左侧工具栏中的“钢笔工具”图标,你将进入钢笔编辑模式…

    other 2023年6月27日
    00
  • linux中的常用命令与快捷键介绍

    接下来我会详细介绍“linux中的常用命令与快捷键”,以下是完整攻略: Linux中的常用命令与快捷键介绍 常用命令 文件/目录操作命令 ls: 列出当前目录下的所有文件和文件夹 cd <directory>: 进入指定的目录 mkdir <directory>: 创建新的目录 rm <file>: 删除文件 rm -r …

    other 2023年6月26日
    00
  • 通过Golang实现linux命令ls命令(命令行工具构建)

    下面是通过Golang实现Linux命令ls的详细攻略: 概述 ls 命令是 Linux 下最常用的命令之一,它用于查看文件和目录列表。本文介绍了如何使用 Golang 实现 ls 命令。 实现思路 我们可以使用 Golang 标准库中的 os 和 ioutil 包来实现 ls 命令。 具体的实现思路是: 读取指定路径下的所有文件和目录 对读取到的文件和目录…

    other 2023年6月26日
    00
  • 苹果iOS8.1.3固件官方下载地址大全汇总介绍

    苹果iOS8.1.3固件官方下载地址大全汇总介绍 1. 了解iOS8.1.3固件 iOS8.1.3是苹果公司发布的一款操作系统固件,为iOS设备提供了一系列的更新和修复。在下载固件之前,我们需要了解一些基本信息。 发布日期:iOS8.1.3固件发布于2015年1月27日。 主要更新:该固件主要包含了一些性能改进、错误修复和安全增强。 兼容设备:iOS8.1.…

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