【问题标题】:Recursively Visiting a node in a binary tree递归访问二叉树中的节点
【发布时间】:2013-10-31 11:07:16
【问题描述】:

我正在学习遍历二叉树的不同方法。我对此有几个问题。我见过这样的中序遍历伪代码(例如):

 InOrder (a node N)
{
   if N is not empty
   {
     InOrder (N's left child)
     visit N
     InOrder (N's right child)
   }
}

“访问”节点是什么意思?这只是意味着打印出来吗?此外,算法如何跟踪它已经访问过的节点?它是否使用在广度优先遍历中使用的队列?

谢谢

【问题讨论】:

  • 我发现了这个关于递归调用和调用堆栈的非常好的 YouTube 视频。这澄清了我上面的问题。这是链接:youtu.be/k0bb7UYy0pY

标签: algorithm data-structures


【解决方案1】:

“访问”意味着用它做某事。归根结底,您希望对每个节点都做一些事情,而不仅仅是遍历所有节点。

算法“跟踪”调用堆栈中访问的内容,在函数参数中。 IE。如果你问“信息在哪里?” ——信息就在那里。不需要额外的存储空间——这就是递归的美妙之处。

【讨论】:

    【解决方案2】:

    “访问”通常是指访问那个“节点”的内存位置。打印包括访问内存中的“节点”。该特定算法不跟踪访问的节点。它利用递归调用。如果您不熟悉递归,我建议您阅读一下。 http://en.wikipedia.org/wiki/Recursion

    【讨论】:

    • 澄清一下,这个特定的算法不必分配额外的空间,例如显式分配一个数据结构来跟踪访问的节点,因为就像@kirilloid 所说,这些信息保存在调用堆栈中 =] 更多关于他的调用堆栈在这里link
    【解决方案3】:

    访问一个节点就是对其应用一些动作,例如打印它。

    树遍历函数的一个这样的实现将接受一个动作,一个函数对象,应该为每个节点调用它。 C 中的示例可能如下所示:

    typedef void (*node_func)(node_t *);
    
    void in_order (node_t *root, node_func f) {
        if (root) {
            in_order(root->left);
            f(root);              // "visit" the node
            in_order(root->right);
        }
    }
    

    也许你实现了一个打印功能:

    void print_node (node_t *node) {
        printf("Node: %s", node->id); // or whatever your node looks like
    }
    

    然后你可以这样称呼它:

    void print_tree(node_t *root) {
        in_order(root, &print_node);
    }
    

    【讨论】:

      【解决方案4】:

      通过访问,我认为它只是在谈论打印它或以某种方式使用它。顺序遍历不同于广度优先,我认为看一些顺序遍历的youtube视频比试图解释更能帮助你理解。

      https://www.youtube.com/watch?v=9870BucMg64 这是一个简短的视频,它是一个相当清晰的顺序示例。

      【讨论】:

        【解决方案5】:

        这是一种遍历二叉树的递归方式。

        “访问”节点是模棱两可的,因为这是一个伪代码,所以它可能只是意味着将其打印出来,或者执行一组特定的代码。

        递归通常通过将其添加到执行堆栈来处理。 非递归和递归都使用相似数量的内存。但是堆栈上的访问时间是微不足道的,因为它们是合乎逻辑的执行顺序。所以在这个特定的例子中,左孩子被递归,然后是节点,然后是右孩子。

        所以在这个例子中是:

                                       A
                                     /   \
                                    B     C
                                   / \   / \
                                  D   E F   G
        

        由于是中序算法,所以会执行: 访问 D、访问 B、访问 E、访问 A、访问 F、访问 C、访问 G。

        【讨论】:

        • 等等不会按顺序遍历D,B,E,A,F,C,G吗?
        猜你喜欢
        • 2020-02-21
        • 2015-09-02
        • 2012-01-26
        • 2015-08-31
        • 2018-05-03
        • 2014-08-12
        • 2019-12-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多