我正在学习遍历二叉树的不同方法。我有几个问题。我已经看到这样的伪代码用于顺序遍历(例如):
InOrder (a node N)
{
if N is not empty
{
InOrder (N's left child)
visit N
InOrder (N's right child)
}
}
“访问”节点是什么意思?这只是意味着打印出来吗?此外,alogirthm如何跟踪它已经访问过的节点?它是否使用在广度优先遍历中使用的队列?
谢谢
答案 0 :(得分:3)
“访问”意味着用它做点什么。在一天结束时,您希望对每个节点执行某些操作,而不仅仅是完成所有节点。
算法“跟踪”函数参数中callstack中访问的内容。即如果你问“信息在哪里?” - 有信息。不需要额外的存储 - 这就是递归的美妙。
答案 1 :(得分:1)
要访问节点,请对其应用某些操作,其中一个示例可能是打印它。
树遍历函数的一个这样的实现将接受应该为每个节点调用的动作,一个函数对象。 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);
}
答案 2 :(得分:1)
“访问”通常是指访问该“节点”的内存位置。打印包括访问内存中的“节点”。该特定算法不跟踪被访问节点。它利用递归调用。如果你不熟悉递归,我建议你阅读一下。 http://en.wikipedia.org/wiki/Recursion
答案 3 :(得分:0)
通过访问,我认为它只是在谈论打印或以某种方式使用它。为了顺序遍历不同于广度,我认为观看有关遍历顺序的YouTube视频将有助于您更好地理解而不是尝试解释。
https://www.youtube.com/watch?v=9870BucMg64 这是一个快速视频,它是一个相当清楚的例子。
答案 4 :(得分:0)
这是遍历二叉树的递归方式。
“访问”节点是不明确的,因为这是一个伪代码,所以它只是意味着将其打印出来,或者执行一组特定的代码。
递归通常通过将其添加到执行堆栈来处理。 非递归和递归都使用相似数量的内存。但是堆栈上的访问时间是微不足道的,因为它们处于逻辑执行顺序。因此,在这个特定的例子中,左子节点被递归,然后是节点,然后是右子节点。
所以在这个例子中会是:
A
/ \
B C
/ \ / \
D E F G
由于它是一个inorder算法,它将被执行: 访问D,访问B,访问E,访问A,访问F,访问C,访问G。