是否有可能按顺序遍历k-ary树?

时间:2016-11-25 22:52:01

标签: algorithm tree inorder esoteric-languages

根据the Homespring proposed language standard,上游的鲑鱼需要进行“对河流系统的有序搜索......在鱼蜱上找到与鲑鱼同名的河流节点”(第6.4节)。 2)。问题是河流节点存储在一个n-ary树中,所以我不确定如何对这棵树进行有序搜索。谷歌搜索没有任何相关性,维基百科页面甚至没有提到任何类型的遍历。是否可以按顺序遍历k-ary树?

1 个答案:

答案 0 :(得分:3)

是的,确实可以这样做!让我们通过比喻来推理。在二叉树中,节点如下所示:

            +---+
            | v |
            +---+
           /     \
          T0     T1

然后按如下方式进行inorder遍历:

  1. 递归执行T0
  2. 的inorder遍历
  3. 访问v
  4. 递归执行T1的inorder遍历。
  5. 换句话说,您可以想象在找到它们时从左到右扫描访问值。扫描首先击中T0,然后击中v,然后击中T1。

    多路树中的节点如下所示:

        +----+----+----+ ... +----+
        | v0 | v1 | v2 | ... | vn |
        +----+----+----+ ... +----+
       /     |    |    |     |     \
      T0    T1    T2   T3   Tn     Tn+1
    

    如果我们在这里使用“从左到右扫描”的想法,我们会这样做:

    1. 递归地执行T0的步行。
    2. 访问v0。
    3. 递归地进行T1的步行。
    4. 访问v1。
    5. ...
    6. 递归地执行Tn。
    7. 的步行
    8. 访问vn。
    9. 递归地执行Tn + 1的顺序步行。
    10. 这是一些伪代码:

      void inorderWalk(Node* v) {
          if (v == null) return;
      
          for (int i = 0; i < v.numChildren; i++) {
              inorderWalk(v.child[i]);
              visit(v.value[i]);
          }
          inorderWalk(v.child[v.numChildren]);
      }