二叉树的遍历算法(详细示例分析)

二叉树的遍历算法是对二叉树中节点的访问顺序的规定。主要分为三种,分别是前序遍历、中序遍历和后序遍历。

1.前序遍历

前序遍历是指先访问根节点,再依次访问左子树和右子树。用递归来实现的话,代码如下所示:

def preorderTraversal(root: TreeNode) -> List[int]:
    if not root:
        return []
    res = []
    res.append(root.val)
    res += preorderTraversal(root.left)
    res += preorderTraversal(root.right)
    return res

接下来以一棵二叉搜索树为例,来说一下前序遍历的过程。二叉搜索树的结构如下所示:

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

按照前序遍历的规定,先访问根节点4,然后访问左子树2、1、3,访问完左子树后再访问右子树6、5、7。因此,这棵二叉搜索树的前序遍历顺序是4、2、1、3、6、5、7。

2.中序遍历

中序遍历是指先访问左子树,再访问根节点,最后访问右子树。同样用递归的方式实现,代码如下所示:

def inorderTraversal(root: TreeNode) -> List[int]:
    if not root:
        return []
    res = []
    res += inorderTraversal(root.left)
    res.append(root.val)
    res += inorderTraversal(root.right)
    return res

还是以前面那棵二叉搜索树为例,按照中序遍历的规定,先访问左子树1、2、3,然后访问根节点4,最后访问右子树5、6、7。因此,这棵二叉搜索树的中序遍历顺序是1、2、3、4、5、6、7。

3.后序遍历

后序遍历是指先访问左子树,再访问右子树,最后访问根节点。同样使用递归的方式实现,代码如下所示:

def postorderTraversal(root: TreeNode) -> List[int]:
    if not root:
        return []
    res = []
    res += postorderTraversal(root.left)
    res += postorderTraversal(root.right)
    res.append(root.val)
    return res

还是以前面那棵二叉搜索树为例,按照后序遍历的规定,先访问左子树1、3、2,然后访问右子树5、7、6,最后访问根节点4。因此,这棵二叉搜索树的后序遍历顺序是1、3、2、5、7、6、4。

除了上述三种遍历方式之外,还有层序遍历,即按照节点所在的层次从上到下依次访问各个节点。则使用队列即可实现,代码如下所示:

def levelOrder(root: TreeNode) -> List[List[int]]:
    if not root:
        return []
    res = []
    queue = [root]
    while queue:
        level = []
        n = len(queue)
        for i in range(n):
            node = queue.pop(0)
            level.append(node.val)
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
        res.append(level)
    return res

以前面那棵二叉搜索树为例,按照层序遍历的规定,先访问第一层的根节点4,然后依次访问第二层的2、6,最后依次访问第三层的1、3、5、7。因此,这棵二叉搜索树的层序遍历顺序是[[4],[2,6],[1,3,5,7]]。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:二叉树的遍历算法(详细示例分析) - Python技术站

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

相关文章

  • ASP.NET Core MVC 从入门到精通之接化发(二)

    随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NET Core MVC 系统开发的人员。 经过前两篇文章的讲解,初步了解ASP.NET Core MVC项目创建,启…

    C# 2023年4月18日
    00
  • 用powershell开发跨平台动态网页

    powershell 动态 网页 跨平台 asp.net dynamic cross platform powershell 传教士 原创文章。始于 2023-04-03 允许转载,但必须保留名字和出处 —【前言】— 以【vbs,和微软jsript】为核心的asp已经淘汰了。ie11后来都不支持网页内嵌vbs了。asp前后端不分离,jscript非正…

    C# 2023年4月18日
    00
  • C#加解密之DES算法的实现

    C#加解密之DES算法的实现 简介 DES是一种对称加密算法,常用于数据加密解密、数字签名等方面。在C#中可以使用System.Security.Cryptography命名空间中的类库来实现DES加解密功能。 实现流程 1. 创建DES对象 首先,我们需要创建一个Des类的对象,代码如下: using System.Security.Cryptograph…

    C# 2023年6月8日
    00
  • C#中常使用进度条的代码

    让我来为你讲解如何在C#应用程序中使用进度条的代码。 1. 创建进度条控件 在Visual Studio中创建一个新的Windows Forms应用程序项目。然后,找到工具箱中的“ProgressBar”控件并将其拖放到窗体上。可以通过设置控件的属性来更改进度条的外观和行为,例如使进度条水平或垂直、更改颜色等等。 2. 编写代码更新进度条 进度条的名称应该是…

    C# 2023年6月7日
    00
  • .Net 自定义转换器JsonConverter的使用详解

    .Net 自定义转换器JsonConverter的使用详解 什么是JsonConverter JsonConverter 是Json.NET 库中的一个抽象类,它是一个非常强大和灵活的工具,用于将一个类型的实例转换为 JSON 自定义结构。你可以使用 JsonConverter 来处理各种情况,例如类型转换、数据格式转换、时间日期转换等等,以满足你的特殊需求…

    C# 2023年5月31日
    00
  • asp.net+ajax简单分页实例分析

    下面是“asp.net+ajax简单分页实例分析”的完整攻略: 一、简介 本文将介绍如何使用asp.net和ajax实现简单分页。在实现分页功能的同时,还同时实现了搜索功能和动态加载数据的效果。 二、环境准备 在开始编写代码之前,需要确保以下工具和环境已经安装: Visual Studio 2017 .NET Framework 4.5 jQuery(最好使…

    C# 2023年5月31日
    00
  • asp.net 生成静态页时的进度条显示

    为了实现在 ASP.NET 生成静态页时显示进度条,需要实现以下步骤: 添加一个 WebForm 页面,用于显示进度条并更新进度。这个页面可以使用 AJAX 技术,在不刷新整个页面的情况下更新进度条。 在生成静态页的代码中,添加一个事件来通知页面更新进度。这个事件可以使用委托来定义,让生成静态页的代码在执行过程中调用委托,传递当前的进度值给页面。 在生成静态…

    C# 2023年6月1日
    00
  • .NET/C#如何使用反射注册事件详解

    要使用反射注册事件,可以遵循以下步骤: 步骤1:获取需要注册事件的对象类型 使用 typeof 或者 GetType() 方法获取需要注册事件的对象类型。例如,下面的示例代码获取了一个名为 MyClass 的类的类型: Type type = typeof(MyClass); 步骤2:获取事件的 MethodInfo 使用 GetEvent 方法获取事件的 …

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部