[英]How is this program a pre-order traversal?
int count(Node node) {
if (node == null)
return 0;
int r = count (node.right);
int l = count (node.left);
return 1 + r + l;
}
此函数返回以树为根的二叉树中的节点数。 一些文章说这是一个预遍历遍历,但是对我来说,这看起来像一个后遍历遍历,因为在访问根之前,我们先遍历左右部分。 我在这里错了吗? 还是我的“拜访”概念有过失?
在此代码中,没有在每个节点上进行任何实际处理,因此在前遍历和后遍历之间没有区别。 如果进行处理,则差异为:
预购
int count(Node node) {
if (node == null)
return 0;
process(node);
int r = count (node.right);
int l = count (node.left);
return 1 + r + l;
}
后订单
int count(Node node) {
if (node == null)
return 0;
int r = count (node.right);
int l = count (node.left);
process(node);
return 1 + r + l;
}
(实际上,在这些情况下,不像你的代码-你会可能要改乘上node.left
之前node.right
保存处理孩子的传统左到右的顺序。)
计数节点的情况很难说算法是预订货还是后订货,因为我们不知道当前节点“何时”“计数” 1。
但是,如果将大小写更改为打印,则变得很清楚:
预购:
int visit(Node node) {
...
node.print(); // pre-order : root cames first
visit(node.left);
visit(node.right);
...
}
后订单
int visit(Node node) {
...
visit(node.left);
visit(node.right);
node.print(); // post-order : root cames last
...
}
如您所见,我们可以说哪个print()首先出现。 通过计数,我们无法确定根是否在子树之前计数(+1)。
这是约定俗成的问题。
是。 您的造访概念是错误的! 在这里访问意味着您位于当前节点,然后尝试遍历该树。 首先在“ root”进行计数,然后再对权利进行计数,然后再离开,因此是预定的。
我们可以说这是预遍历,因为count
函数先于节点而不是其子节点被应用。
但是问题很棘手,因为您正在使用直接递归,并且在同一个函数中同时进行遍历和“动作”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.