arrays - 用数组存储 k-ary 树
问题描述
仅当您在移动到下一个节点之前用 k-children 从左到右填充每个节点时,将 k-ary 树存储为数组是否有效?
前任:
1
/ | \
2 3 4
/ | \
5 6 7
可以存储为如下所示的数组:
[X,1,2,3,4,5,6,7]
0 1 2 3 4 5 6 7
通过索引/k 可以找到任何父级。
但是,对于相同的数据但存储为:
1
/ | \
2 3 4
/ | |
5 6 7
以 7 作为 3 索引的孩子不再有效。
此外,一般来说,兄弟姐妹在当前节点的 +- k 索引内,但我如何确保我不会意外访问父/叔节点?
解决方案
假设根节点在数组中的索引 0 处,则索引处的节点的子节点位于i
索引(i*n) + 1
through处(i*n) + n
。节点的父节点位于 index (i-1)/n
。如果您想将根放在索引 1 处,有类似的等式,但没有充分的理由让索引 0 空置。
如果要访问当前节点的所有兄弟节点,首先找到父节点,然后访问该节点的所有子节点。这样您就不会意外访问“叔叔”节点。
通常,像这样存储在数组中的树是完全二叉树:除了最后一层之外的所有层都是满的,如果最后一层没有完全满,那么它会从左到右被填满。
您不必填写所有位置,但如果您不需要,那么您需要在该节点的位置有某种标志来告诉您它是空的。
但是像在第二个示例中那样存储树,其中索引 3 的第一个子节点通常放置索引 2 的最后一个子节点会破坏这些计算。您必须在父节点中存储一组子索引,并在每个子节点中存储父索引。
推荐阅读
- django - 我无法使用 CreateView 在小部件调整 render_field 中获得选定的学生
- android - 如何在 TextInputLayout 中分别设置提示和错误文本的样式
- php - 用页面 wordpress 填充数组
- ios - MapBox 多边形绘图
- api - 如何在沙盒中检查 webhook 以获取 squareup 支付网关
- python - 是否有一种内置方法来定义一个接受 1 个参数或 3 个参数的函数?
- date - Qlik Sense:从 Google Analytics API 更改日期字段格式
- amazon-s3 - 自动同步 S3 到本地
- asp.net-core - 如何自定义 OpenIddict 产生的授权错误?
- grafana - 按时间筛选能耗数据