php - 如何在不使用广度优先遍历的情况下找到二叉树第 k 层的节点数?

标签 php mysql algorithm binary-tree tree-traversal

给定这个二叉树(实际上,二叉树可以是随机的和动态的,这只是一个例子...):

请参阅二叉 TreeMap 像的链接:binary tree example

这是给定的事实:

  1. 所有节点都连接到它们的父节点,这样我们就可以从下到上遍历(当然也可以从上到下遍历)。
  2. 所有节点都保存关于它们的左右部分有多少个后代的信息。

问题是这样的:我需要找到一种方法来计算第 2 层中的节点总数(实际上,在任何层中,但现在,让我们专注于第 2 层)。显然,如果我们事先知道二叉树的结构,答案是 3,但假设我们没有这张图片,只有给定的事实。

这里的另一个问题是我们将从第 2 层(我们的目标层)中的节点开始,而不是根节点。在此示例中,我选择了节点 F。

我知道使用广度优先顺序遍历是直接的解决方案,但我发现它太耗时了,因为每次我读取一个节点时,我都会从数据库中查询它。

我正在寻找更实用的方法。但是如果由于给定数据不足而“不可能”解决这个问题,请告诉我应该提供哪些其他数据才能解决这个问题。我会评估它是否可行。

顺便说一句,我正在创建一个网站并使用 PHP 和 MySQL。但我只想要解决方案的概念或解释,更像是一种算法而不是编程片段或代码...

希望有人能回答我...非常感谢!

最佳答案

“广度优先搜索”是一种方法。但是,如果您不想使用它,我建议您在节点中包含指向兄弟的指针。如果您通常必须执行此类查询,那将是一个很大的节省。

编辑:

如果您可以对节点进行非规范化,并将所有节点的同级和级别存储在表中,那么您就可以毫无问题地进行查询。

SELECT * FROM nodes where level=2

关于php - 如何在不使用广度优先遍历的情况下找到二叉树第 k 层的节点数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7456354/

相关文章:

algorithm - Dijkstra:在有向图中找到最短路径

arrays - 为什么最大和子数组是暴力 O(n^2)?

php - 从数据库中选择下一个事件

javascript - 如何在HTML和Javascript中使用php?

mysql [第 1 行被截断;它包含的数据多于输入列] 错误

php - 将购物袋数据存储到 mysql 数据库中的最有效方法

php - 当 where 子句中的日期时间介于之间时 MySQL 查询速度慢

php - 列表列逻辑

php - 用户物理位置的最佳实践(输入、数据类型、显示和验证)

algorithm - 扩展欧几里得算法 - 是否有非递归版本?