繁体   English   中英

该程序如何进行预遍历?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM