【问题标题】:Is it possible to traverse a k-ary tree in-order?是否可以按顺序遍历k-ary树?
【发布时间】:2016-11-25 22:52:01
【问题描述】:

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

【问题讨论】:

    标签: algorithm tree inorder esoteric-languages


    【解决方案1】:

    是的,确实可以做到这一点!让我们以此类推。在二叉树中,一个节点是这样的:

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

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

    1. 递归地对 T0 进行中序遍历
    2. 访问v
    3. 递归地执行 T1 的中序遍历。

    换句话说,您可以想象在找到值时从左到右扫描访问值。扫描首先命中 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. 递归地执行 Tn+1 的有序游走。

    这里有一些伪代码:

    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]);
    }
    

    【讨论】:

    • 那么如果每个节点只有一个值关联,那么该值会被多次访问?
    • @Ontonator 在这种情况下谈论“中序遍历”有点困难。有一个相关的遍历顺序称为 Euler 巡回,可能是您正在寻找的?
    • 我认为不会是这样,因为鲑鱼会出现在同名节点的 first 出现处,因此搜索最终将等同于预购搜索。无论如何,我认为这是我们最接近正确解决方案的方法,因此我将其标记为正确。
    猜你喜欢
    • 2014-01-10
    • 2017-11-28
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    相关资源
    最近更新 更多