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

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

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图片上传实例

    关于asp.net图片上传实例,有多种操作方式,本文将介绍一个常用的方法。本文将分为以下几个部分进行讲解: 前端HTML页面上传文件表单的编写 后端接收前端上传的文件,进行保存的的操作 通过示例进行实战演练 1.前端HTML页面上传文件表单的编写 HTML编写中最常用的上传文件表单是form表单的input选择文件框,其HTML结构大概如下所示: <f…

    C# 2023年6月1日
    00
  • ASP.NET MVC命名空间时引起错误的解决方法

    当使用ASP.NET MVC框架进行开发时,有时候会遇到命名空间冲突而引起的编译错误。本文将详细讲解如何解决命名空间冲突的问题。 引起错误的原因 在ASP.NET MVC项目中,可能会出现几个不同的类库或者插件都使用了相同的命名空间。这时候编译器就会产生冲突,无法确定要使用哪个类库或插件中的命名空间。从而导致编译失败,程序无法正常运行。 解决方法 1. 使用…

    C# 2023年5月15日
    00
  • asp.net 细说文件读写操作(读写锁)

    ASP.NET细说文件读写操作(读写锁) 介绍 在ASP.NET应用程序中,文件读写操作是很常见的场景,但是如果多个线程同时访问同一个文件并执行读写操作,就有可能会引起线程安全问题,进而导致应用程序崩溃或数据丢失等问题。为了确保线程安全,我们需要采用读写锁来控制文件的访问。本文将详细讲解ASP.NET应用程序中如何实现文件读写操作,并介绍读写锁的使用。 文件…

    C# 2023年5月15日
    00
  • .NET MemoryCache如何清除全部缓存

    清除.NET MemoryCache中全部缓存可以通过以下步骤来实现: 实例化MemoryCache对象 在.NET中,可以通过实例化MemoryCache类来创建缓存对象,如下所示: using System; using System.Runtime.Caching; MemoryCache cache = MemoryCache.Default; 删除…

    C# 2023年6月6日
    00
  • c#字符长度查询代码

    下面是关于C#字符长度查询代码的完整攻略: 1. 字符串长度及字符长度的定义 首先,需要明确字符串长度和字符长度的定义: 字符串长度:指的是一个字符串所包含的字符个数。 字符长度:指的是不同编码对应的字符所占用的字节数。 举个例子,假设有以下字符串: "abc你好" 这个字符串的长度是6,因为它包含了6个字符;但是它的字符长度则取决于所使…

    C# 2023年6月1日
    00
  • C#使用Post调用接口并传递json参数

    下面是关于“C#使用Post调用接口并传递json参数”的完整攻略: 1. 确定请求地址和请求方式 使用Post调用接口需要确定请求地址和请求方式。通常情况下,请求地址是指接口的URL,请求方式是指HTTP请求的方式,即”GET”或”POST”。 2. 导入必要的命名空间 在进行Post调用接口时,需要导入以下两个命名空间: using System.Net…

    C# 2023年5月31日
    00
  • C#执行Javascript代码的几种方法总结

    C#执行JavaScript代码的几种方法总结 在C#代码中执行JavaScript代码是非常有用的操作,本文将介绍C#执行JavaScript代码的几种方法,以及各种方法的优缺点和应用场景。 方法一:WebBrowser控件 WebBrowser控件是一个基于IE内核的控件,可以解析和渲染HTML文档,同时支持JavaScript代码的执行。可以通过在C#…

    C# 2023年5月15日
    00
  • C#微信公众平台开发之access_token的获取存储与更新

    C#微信公众平台开发之access_token的获取存储与更新 前言 微信公众平台开发中,access_token是关键的全局唯一接口调用凭据,获取access_token是进行后续接口调用的必要步骤。因为获取access_token每日调用次数有限,并且获取access_token的过程中存在一些约束和具体的有效期,所以需要进行存储和更新。 本文将详细介绍…

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