Algorithm 递归访问二叉树中的节点

Algorithm 递归访问二叉树中的节点,algorithm,data-structures,Algorithm,Data Structures,我正在学习遍历二叉树的不同方法。关于这一点,我有几个问题。我见过这样的顺序遍历伪代码(例如): “访问”节点意味着什么?这仅仅意味着要打印出来吗?此外,算法如何跟踪它已经访问的节点?它是否使用宽度优先遍历中使用的队列 谢谢你的访问我想这只是在谈论打印或以某种方式使用它。顺序遍历不同于广度优先,我认为观看一些youtube上的顺序遍历视频会帮助你们更好地理解,而不是试图解释 下面是一个快速视频,它是一个非常清晰的顺序示例。“访问”的意思是用它做点什么。在一天结束时,您希望对每个节点执行一些操作,

我正在学习遍历二叉树的不同方法。关于这一点,我有几个问题。我见过这样的顺序遍历伪代码(例如):

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


谢谢你的访问我想这只是在谈论打印或以某种方式使用它。顺序遍历不同于广度优先,我认为观看一些youtube上的顺序遍历视频会帮助你们更好地理解,而不是试图解释

下面是一个快速视频,它是一个非常清晰的顺序示例。

“访问”的意思是用它做点什么。在一天结束时,您希望对每个节点执行一些操作,而不仅仅是遍历所有节点


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

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

树遍历函数的一个这样的实现将接受一个操作,一个应该为每个节点调用的函数对象。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_tree(node_t *root) {
    in_order(root, &print_node);
}
也许您实现了一个打印功能:

void print_node (node_t *node) {
    printf("Node: %s", node->id); // or whatever your node looks like
}
然后你可以这样称呼它:

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_tree(node_t *root) {
    in_order(root, &print_node);
}

“访问”通常指访问该“节点”的内存位置。打印包括访问内存中的“节点”。此特定算法不跟踪访问的节点。它利用递归调用。如果您不熟悉递归,我建议您阅读一下

这是遍历二叉树的递归方法

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

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

因此,在本例中:

                               A
                             /   \
                            B     C
                           / \   / \
                          D   E F   G
由于它是一种有序算法,因此将执行:
访问D、访问B、访问E、访问A、访问F、访问C、访问G。

为了澄清,此特定算法不必分配额外的空间,例如明确分配数据结构以跟踪访问的节点,因为如@kirilloid所说,这些信息保存在callstack中=]关于callstack的更多信息等等,它不是按顺序遍历D、B、E、A、F、C、G吗?我在递归调用和调用堆栈上发现了这段非常好的YouTube视频。这澄清了我上面的问题。以下是链接: