POV

POV

困难

说明

把树重新挂到选定的节点上。

树是一种特殊的图,其中所有节点都相连,但不存在环。 也就是说,任意两个节点之间有且只有一条路径。

这道练习的重点,就是把树重新定向,从另一个角度来观察它。 比如,家谱通常是从祖先的角度来呈现的:

    +------0------+
    |      |      |
  +-1-+  +-2-+  +-3-+
  |   |  |   |  |   |
  4   5  6   7  8   9

但树本身并没有固定的方向。 把树中的任意一个其他节点提到根的位置,连同它的关系一起拖动,就能从那个节点的角度呈现同样的信息。 所以,同一棵树从节点 6 的角度看是这样的:

        6
        |
  +-----2-----+
  |           |
  7     +-----0-----+
        |           |
      +-1-+       +-3-+
      |   |       |   |
      4   5       8   9

这样一来,我们就能更简单地描述两个节点之间的路径。 比如,从 6 到 9 的路径(在第一棵树中,它先向上到根,再向下到另一个叶节点)可以看作沿着路径 6-2-0-3-9 走。

这道练习要求你拿到一棵输入的树,并从其中一个节点的视角把它重新定向。

实现说明

树对象有两个属性:

  • String标签
  • List<Tree>子节点

测试程序通过反复调用Tree.of构建函数来创建树。例如,下面这条语句

Tree tree = Tree.of("a", List.of(Tree.of("b"), Tree.of("c", List.of(Tree.of("d")))));

会构造出下面这棵树:

      "a"
       |
    -------
    |     |
   "b"   "c"
          |
         "d"

你可以假设测试用的树中不会有重复的值。


FromPov和PathTo这两个方法是这道练习最有意思的部分。

FromPov方法接收一个字符串实参from,它通过节点的值来指定树中的一个节点。它应当返回一棵以from的值为根节点的树。你可以修改原来的树并返回它,也可以新建一棵树并返回新树。如果返回新树,你可以随意消耗或销毁原来的树。当然,能不改动它就更好了。

PathTo方法接收两个字符串实参from和to,它们通过节点的值来指定树中的两个节点。它应当返回树中从第一个节点到第二个节点的最短路径。

异常消息

有时需要抛出一个异常。这样做时,应当始终附上有意义的错误消息,说明错误的来源。这会让你的代码更易读,也大大有助于调试。

这道练习要求你使用 throw 关键字,在传给Tree()类的树无法重新定向,或者无法在start node和end node之间找到路径时,多次“抛出”UnsupportedOperationException。只有当你既throw了exception,又附带了消息,测试才会通过。

要抛出带有消息的UnsupportedOperationException,请把消息作为实参传给该exception类型:

// when a tree cannot be oriented to a new node POV
throw new UnsupportedOperationException("Tree could not be reoriented");

// when a path cannot be found between a start and end node on the tree.
throw new UnsupportedOperationException("No path found");
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Java Exercism

准备好开始 POV 了吗?

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