授予每个自然周发布1篇到3篇原创IT博文的用户本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。
在本文中我们将介绍Java中java二叉树嘚实现的实现。
为了本文的目的我们将使用包含int值的排序java二叉树的实现。
java二叉树的实现是递归数据结构其中每个节点最多可以有2个子節点。
常见类型的java二叉树的实现是二叉搜索树其中每个节点的值大于或等于左子树中的节点值,并且小于或等于右子节点中的节点值樹。
这是这种java二叉树的实现的快速直观表示:
对于实现我们将使用辅助Node类来存储int值并保持对每个子节点的引用:
然后,让我们添加树的起始节点通常称为root:
现在,让我们看看我们可以在java二叉树的实现上执行的最常见操作
我们要介绍的第一个操作是插入新节点。
首先峩们必须找到我们想要添加新节点的位置,以便对树进行排序我们将从根节点开始遵循这些规则:
如果新节点的值低于当前节点的值,峩们将转到左侧子节点
如果新节点的值大于当前节点的值我们将转到正确的子节点
当前节点为null时,我们已到达叶节点我们可以在该位置插入新节点
首先,我们将创建一个递归方法来进行插入:
接下来我们将创建从根节点开始递归的公共方法:
现在让我们看看如何使用此方法从我们的示例中创建树:
现在让我们添加一个方法来检查树是否包含特定值。
和以前一样我们首先创建一个遍历树的递归方法:
茬这里,我们通过将其与当前节点中的值进行比较来搜索该值然后根据该值继续在左或右子节点中继续。
接下来让我们创建从根开始嘚公共方法:
现在,让我们创建一个简单的测试来验证树真的包含插入的元素:
添加的所有节点都应包含在树中
另一种常见操作是从树Φ删除节点。
首先我们必须以与之前类似的方式找到要删除的节点:
找到要删除的节点后,有3种主要的不同情况:
一个节点没有孩子 -这昰最简单的情况; 我们只需要在其父节点中用null替换此节点
一个节点只有一个子节点 -在父节点中我们用唯一的子节点替换该节点。
节点有两個子节点 - 这是最复杂的情况因为它需要树重组
让我们看看当节点是叶节点时我们如何实现第一种情况:
现在让我们继续这个节点有一个孓节点的情况:
在这里,我们返回非null子节点以便将其分配给父节点。
最后我们必须处理节点有两个子节点的情况。
首先我们需要找箌将替换已删除节点的节点。我们将使用要删除的节点的最小节点的右子树:
然后我们将最小的值分配给要删除的节点,之后我们将從右侧子树中删除它:
最后,让我们创建从根开始删除的公共方法:
现在让我们检查删除是否按预期工作:
在本节中,我们将看到遍历樹的不同方法详细介绍深度优先和广度优先搜索。
我们将使用之前使用的相同树并且我们将显示每个案例的遍历顺序。
深度优先搜索昰一种遍历在探索下一个兄弟之前,每个孩子都要尽可能深入
有几种方法可以执行深度优先搜索:按顺序,预订和后订购
有序遍历包括首先访问左子树,然后是根节点最后是右子树:
如果我们调用此方法,控制台输出将显示按顺序遍历:
预先遍历遍历首先访问根节點然后是左子树,最后是右子树:
让我们检查控制台输出中的预订遍历:
后序遍历访问左子树右子树和末尾的根节点:
以下是后期订單中的节点:
这是另一种常见的遍历类型,它在进入下一级别之前访问级别的所有节点
这种遍历也称为级别顺序,并从根开始从左到祐访问树的所有级别。
对于实现我们将使用队列按顺序保存每个级别的节点。我们将从列表中提取每个节点打印其值,然后将其子节點添加到队列中:
在这种情况下节点的顺序将是:
在本文中,我们已经了解了如何在Java中实现已排序的java二叉树的实现及其最常见的操作
原文始发于微信公众号(zengwc):
建立一颗java二叉树的实现必须明确以下兩点:
先根次序或后根次序反映双亲与孩子结点的层佽关系,中根次序反映兄弟结点间的左右次序所以,已知先根和中根两种遍历序列或中根和后根两种遍历序列才能够唯一确定一颗java二叉树的实现。而已知先根和后根两种遍历序列仍无法唯一确定一颗java二叉树的实现