轨道
/
Go
Go
/
练习
/
Zipper
Zipper

Zipper

中等

说明

为二叉树创建一个 zipper。

Zippers 是一种纯函数式的导航和操作数据结构的方式。它本质上包含一个数据结构和一个指向该数据结构的指针(称为焦点)。

例如,给定一棵玫瑰树(每个节点包含一个值和一个子节点列表),zipper 可以支持以下操作:

  • from_tree(从玫瑰树中得到一个 zipper,焦点在根节点上)
  • to_tree(从 zipper 中得到玫瑰树)
  • value(获取焦点节点的值)
  • prev(把焦点移到同一父节点下的上一个子节点,返回一个新的 zipper)
  • next(把焦点移到同一父节点下的下一个子节点,返回一个新的 zipper)
  • up(把焦点移到父节点,返回一个新的 zipper)
  • set_value(设置焦点节点的值,返回一个新的 zipper)
  • insert_before(在焦点节点前插入一棵新的子树,它成为焦点节点的 prev,返回一个新的 zipper)
  • insert_after(在焦点节点后插入一棵新的子树,它成为焦点节点的 next,返回一个新的 zipper)
  • delete(移除焦点节点及其所有子树,焦点会移到 next 节点,如果不行则移到 prev 节点,再不行则移到父节点,返回一个新的 zipper)

Zipper 的行为

Zipper 提供了一种以函数式方式在Node树中移动的方法。

所有 Zipper 调用都应返回一个_新的_ Zipper 对象。 如果 Zipper 没有改变值(即没有调用任何Set*方法),就应沿用同一棵底层树。 调用Set*方法后,新的 Zipper 应该有一棵新的树,而原来的树保持不变。

把焦点切换到无效Node的 Zipper 调用应返回错误。

通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Go Exercism

准备好开始 Zipper 了吗?

注册 Exercism,借助 35 个概念167 个练习 和真人导师指导,学习并掌握 Go,全部免费。