游戏知识实验课:树形列表折叠后哪些条目仍然可见——十节点树形菜单的十四次展开切换(练习26)

  • 2026-10-31
  • 1

树形菜单的某个节点被展开,并不保证它的子项现在出现在屏幕上;更上层的祖先若折叠,整段分支仍可能隐藏。可见性需要沿祖先链一起判断。

本篇用一组独立输入把规则展开为可重复核对的记录。先确认单位、编号及边界,再自行尝试推演,然后寻找与下面过程第一次不同的位置。所有结果只在这里写明的规则下成立,不能当作所有游戏的统一实现。

规则与输入

十个节点形成一棵有根树,零号为根且始终显示。节点按编号顺序排列子项;只有其所有祖先都处于展开集合时才可见。操作只切换有孩子节点的展开标记,允许从保存状态改变隐藏分支,选中身份保持不变。

节点0到9的父节点[None, 0, 0, 0, 3, 2, 1, 4, 0, 6],None为根 初始只展开根,选中4 [4, 4, 6, 0, 1, 1, 6, 6, 3, 6, 0, 2, 4, 0]

逐步推演

切换节点4后,展开集合[0, 4],可见行按先序为[0, 1, 2, 3, 8],选中身份仍为4,当前被祖先折叠隐藏。

切换节点4后,展开集合[0],可见行按先序为[0, 1, 2, 3, 8],选中身份仍为4,当前被祖先折叠隐藏。

切换节点6后,展开集合[0, 6],可见行按先序为[0, 1, 2, 3, 8],选中身份仍为4,当前被祖先折叠隐藏。

切换节点0后,展开集合[6],可见行按先序为[0],选中身份仍为4,当前被祖先折叠隐藏。

切换节点1后,展开集合[1, 6],可见行按先序为[0],选中身份仍为4,当前被祖先折叠隐藏。

切换节点1后,展开集合[6],可见行按先序为[0],选中身份仍为4,当前被祖先折叠隐藏。

切换节点6后,展开集合[],可见行按先序为[0],选中身份仍为4,当前被祖先折叠隐藏。

切换节点6后,展开集合[6],可见行按先序为[0],选中身份仍为4,当前被祖先折叠隐藏。

切换节点3后,展开集合[3, 6],可见行按先序为[0],选中身份仍为4,当前被祖先折叠隐藏。

切换节点6后,展开集合[3],可见行按先序为[0],选中身份仍为4,当前被祖先折叠隐藏。

切换节点0后,展开集合[0, 3],可见行按先序为[0, 1, 2, 3, 4, 8],选中身份仍为4,当前可见。

切换节点2后,展开集合[0, 2, 3],可见行按先序为[0, 1, 2, 5, 3, 4, 8],选中身份仍为4,当前可见。

切换节点4后,展开集合[0, 2, 3, 4],可见行按先序为[0, 1, 2, 5, 3, 4, 7, 8],选中身份仍为4,当前可见。

切换节点0后,展开集合[2, 3, 4],可见行按先序为[0],选中身份仍为4,当前被祖先折叠隐藏。

最终可见[0],展开状态与数据存在状态始终分开处理。

怎样独立检查

对每个节点沿父链走到根,检查所有祖先是否展开;再用完整先序遍历的顺序过滤可见节点。选中项被隐藏时只报告不可见,不把同一显示行上的其他节点误认成原选中项。

折叠只改变显示,节点数据仍存在。本例没有自动把选中项转移到父节点,也没有滚动位置或虚拟列表;真实界面可以另定这些行为。保存展开状态时应使用节点身份,不能只依赖当前行号。

练习时先保存原始输入及中间结果,再只改变一个条件观察差异。重点检查空状态、相同数值、恰好到达边界和最后一步。不要为了凑出相同的最终结果而忽略较早出现的偏差,过程和结论都应能由同一套规则解释。