java算法题 树的遍历

在计算机科学中,“树”是一种广泛使用的抽象数据类型(ADT)或实现此ADT的数据结构,它模拟分层树结构,其根值和带有父节点的子级子树表示为一组链接节点。



java树形结构取每个节点的同一字段 java实现树的遍历_算法

可以将树数据结构递归定义为节点的集合(从根节点开始),其中每个节点都是由值组成的数据结构,以及对节点(“子级”)的引用列表,其中约束,即没有重复的引用,也没有指向根的约束。



java树形结构取每个节点的同一字段 java实现树的遍历_算法_02


树样本

可以通过几种方式遍历树:

  • 预定遍历 :根,左,右。
    在我们的示例中:ABDHIEJCFG K
  • 顺序遍历 :左,根,右。
    在我们的示例中:HDIBJEAFCK G
  • 后遍历遍历 :左,右,根。
    在我们的示例中:HIDJEBFKGC A
  • 级别顺序遍历 ,也称为广度优先搜索。
    在我们的示例中:ABCDEFGHIJ K

在该教程中,您将学习如何在Java中使用递归和不递归实现这些不同的Tree Traversal Algorithms。 如您所见,递归解决方案比迭代解决方案容易。 但是,您需要了解这两种解决方案,因为在编码采访中经常会要求实现这些算法。

对于我们的示例,我们将使用Java编程语言,但是在其他语言(如C ++或Python)中实现的逻辑是相同的。

代表一棵树

第一步是代表一棵树。 一棵树有节点。 因此,我们首先定义一个Node类。 节点将具有以下属性:

  • 表示节点数据的数据
  • 指向左节点的指针
  • 指向右节点的指针

它为我们提供了以下Node类:

为了表示一棵树,我们只需要选择一个Node实例作为树的根。 它为树构建提供了以下代码:

递归的树预遍历

我们从实现带有递归的树形预遍历算法开始。 我们想通过显示Root,Left和Right节点的数据遍历树的每个节点。

因此,我们需要定义一个递归的preOrderTraverse方法,将Node作为参数,并进行以下操作:

  • 显示数据
  • 调用左侧节点的preOrderTraverse
  • 为正确的节点调用preOrderTraverse

它为我们提供了以下实现:

您可以在YouTube的视频中发现具有递归树形预遍历算法的实现和执行:

带有迭代解决方案的树形预遍历

现在,事情变得有些复杂了,因为我们将使用带有迭代解决方案的树形预遍历算法来实现。 为此,我们将需要一个Node

首先,我们将Tree根推入Stack 。 然后,当堆栈不会为空时,我们将进行迭代。 我们一个接一个地弹出所有节点,对于每个节点,执行以下步骤:

  • 显示数据
  • 将正确的孩子推入堆栈
  • 将其左子项推入堆栈

它为我们提供了以下实现:

您可以在YouTube视频中发现带有迭代解决方案树形预遍历算法的实现和执行:

递归遍历树

我们使用递归实现树顺序遍历算法。 我们要遍历树的每个节点(从Left节点开始),显示Root的数据,并以Right节点结束。

因此,我们需要定义一个带有参数Node的递归inOrderTraverse方法,并进行以下操作:

  • 为左节点调用inOrderTraverse
  • 显示数据
  • 为正确的节点调用inOrderTraverse

它为我们提供了以下实现:

您可以在YouTube的视频中发现带递归树顺序遍历算法的实现和执行:

迭代求解树有序遍历

现在,事情变得有些复杂了,因为我们将使用带有迭代解决方案的树顺序遍历算法来实现。 我们将使用Node 。 当当前节点不为空或节点 堆栈不为空时,我们遍历树。

在每次迭代中,我们尝试从当前节点到达最左边的节点。 在嵌套的迭代过程中,我们添加遍历Node 堆栈中的每个节点 。 在此迭代结束时,当前节点为null。 因此,我们从堆栈中弹出一个Node并显示其数据。 最后,现在,我们访问正确的子树。

它为我们提供了以下实现:

您可以在YouTube的视频中发现具有迭代解决方案的顺序树遍历算法的实现和执行:

递归的树后订单遍历

我们使用递归实现树后顺序遍历算法。 我们要遍历树的每个节点,从“左”节点开始,再从“右”节点继续,然后显示“根”的数据。

因此,我们需要定义一个带有参数Node并执行以下操作的递归postOrderTraverse方法:

  • 调用左侧节点的PostTraverse发布
  • 为正确的节点调用PostTraverse
  • 显示数据

它为我们提供了以下实现:

您可以在YouTube视频中发现带有递归树后顺序遍历算法的实现和执行:

带有迭代解决方案的树后订单遍历

现在,事情变得有些复杂了,因为我们将使用带有迭代解决方案的树后顺序遍历算法来实现。 我们首先创建两个Node 堆栈 ,分别命名为nodeStack1和nodeStack2。 我们将Tree根目录推送到nodeStack1中。

我们在第一个堆栈不为空时进行迭代。 在每次迭代中,我们从nodeStack1中弹出一个项目,然后将其推送到nodeStack2。 然后,我们将弹出项的左右子项推入nodeStack1。

然后,在第二个循环中,我们打印出nodeStack2的所有元素的数据。 这为我们提供了以下代码:

您可以在YouTube视频中发现带有迭代解决方案树后顺序遍历算法的实现和执行:

树级顺序遍历

最后,我们将实现树级顺序遍历算法。 此算法也称为广度优先搜索。 我们需要使用迭代解决方案。 该解决方案使用NodeQueue 。 我们添加树根。

然后,我们在Queue不为空时进行迭代。 我们使一个节点出队并打印数据。 然后,我们添加子节点(如果不为null),则在第一和第二之间添加。

它为我们提供了以下实现:

您可以在YouTube视频中发现树级顺序遍历算法的实现和执行:

结论

本文将使您发现主要的树遍历算法及其在Java中的实现。 可以使用下面提供的Tree类的完整源代码,其中包含调用所有提供的方法的main方法: