使用 PHP 数组创建二叉树

我们可以使用 PHP 数组来实现二叉树。由于二叉树的子节点最多为 0 到 2 个,因此我们可以将最大子节点数设为 2,并构建一个公式来查找给定节点的子节点。让我们从上到下、从左到右为二叉树中的节点编号。因此,根节点的编号为 0,左边的子节点为 1,右边的子节点为 2,这样一直到每个节点都被编号为止,就像下图一样:

image 2023 11 08 09 52 39 646

我们不难看出,节点 0 的左侧子节点是 1,右侧子节点是 2。对于节点 1,左边的子节点是 3,右边的子节点是 4,以此类推。我们可以很容易地把它用公式表示出来:

如果 i 是节点编号,那么:

Left node = 2 x i + 1
Right node = 2 x (i + 1)

现在,让我们使用 PHP 数组为比赛日程部分创建一个示例。如果我们按照讨论的内容进行排序,那么它将看起来像这样:

$nodes = [];
$nodes[] = "Final";
$nodes[] = "Semi Final 1";
$nodes[] = "Semi Final 2";
$nodes[] = "Quarter Final 1";
$nodes[] = "Quarter Final 2";
$nodes[] = "Quarter Final 3";
$nodes[] = "Quarter Final 4";

基本上,我们将创建一个从 0 开始自动索引的数组,该数组将用作二叉树表示。现在,我们将修改 BinaryTree 类,以使用该数组代替我们的节点类、左右子节点以及遍历方法。现在,我们将根据节点编号而不是实际的节点引用来遍历:

Unresolved include directive in modules/ROOT/pages/ch06/ch6-06.adoc - include::example$Chapter06/3.php[]

从前面的实现中我们可以看到,遍历部分使用的是节点定位而不是引用。节点位置只是数组索引。因此,我们可以直接访问数组索引并检查它是否为空。如果不是,我们就可以使用递归方式继续深入。如果要使用数组创建二叉树并打印数组值,我们必须编写以下代码:

Unresolved include directive in modules/ROOT/pages/ch06/ch6-06.adoc - include::example$Chapter06/3.php[]

如果我们在命令行中运行此代码,我们将看到以下输出:

Final
-Semi Final 1
--Quarter Final 1
--Quarter Final 2
-Semi Final 2
--Quarter Final 3
--Quarter Final 4

我们可以使用一个简单的 while 循环来遍历数组并访问每个节点,而不是递归进行。在我们所有的递归示例中,我们会发现如果以迭代的方式使用某些递归,效率会更高。我们也可以直接使用它们,而不是为二叉树创建一个类。