java算法题 树的遍历
在计算机科学中,“树”是一种广泛使用的抽象数据类型(ADT)或实现此ADT的数据结构,它模拟分层树结构,其根值和带有父节点的子级子树表示为一组链接节点。
可以将树数据结构递归定义为节点的集合(从根节点开始),其中每个节点都是由值组成的数据结构,以及对节点(“子级”)的引用列表,其中约束,即没有重复的引用,也没有指向根的约束。
树样本
可以通过几种方式遍历树:
- 预定遍历 :根,左,右。
在我们的示例中: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视频中发现带有迭代解决方案的树后顺序遍历算法的实现和执行:
树级顺序遍历
最后,我们将实现树级顺序遍历算法。 此算法也称为广度优先搜索。 我们需要使用迭代解决方案。 该解决方案使用Node的Queue 。 我们添加树根。
然后,我们在Queue不为空时进行迭代。 我们使一个节点出队并打印数据。 然后,我们添加子节点(如果不为null),则在第一和第二之间添加。
它为我们提供了以下实现:
您可以在YouTube视频中发现树级顺序遍历算法的实现和执行:
结论
本文将使您发现主要的树遍历算法及其在Java中的实现。 可以使用下面提供的Tree类的完整源代码,其中包含调用所有提供的方法的main方法: