【发布时间】:2017-11-02 09:40:16
【问题描述】:
问候社区
这更像是一个概念性问题,所以请多多包涵。
由于在二叉树的遍历和操作顺序中存在多个递归实例,我对以下算法感到困惑。我在用着 以 Preorder 算法为例。
代码如下。
1 public static void Preorder(Node node){
2 if (node == null)
3 return;
4 System.out.print(node.element + " ");
5 Preorder(node.left);
6 Preorder(node.right);
7 }
我感到困惑的是,递归调用的命令链。 首先在第一次“迭代”的算法中,两个 Preorder 方法都被同时激活。就像第 5 行和第 6 行的方法同时发生一样,没有“等待”另一个方法完成。
还是更像#6 Prerder() 一直被调用,直到遇到基本情况。 然后#7被调用直到它的基地被击中?此外,如果这是真的,如何到达子树左侧的所有右节点,反之亦然?
假设你有这个,树(N = 任意数字)
N
/ \
N N
/ \ \
N N N
\
N
/ \
N N
/
N
如果方法不断重复 node.left 参数,算法究竟如何“到达”右子树上的这些最右节点?似乎你只会得到最左边的节点而没有别的。
我仍在思考nodes.left 和nodes.right 的整个概念,以及递归和其他算法如何有效地使用它们。似乎是一个神秘的过程,但至少可以说是迷人的。
【问题讨论】:
-
对
Preorder的递归调用也将迭代每个子树的left和right,因此将访问所有节点。 -
怎么样? @4castle ,它不像有一个迭代函数,或者除非(如果我在这里错了,请纠正我)。 Preorder(node.left),调用同时调用 Preorder(node.left) & Preorder(node.right)。因此它是一个同时的递归调用。
-
在这种情况下,我使用“迭代”一词来指代“迭代对象的字段”,而不是“迭代数组的元素”。首先它调用
Preorder(node.left);,然后它调用Preorder(node.right);。它们不是同时的。在第一个语句完成之前,第二个语句不会开始。 -
@castle 因此,由于这些不是同时的方法,如果左树的方法只是 Node.left ,那么如何访问左子树上的右节点?并不是说很难,我只是对如何访问左侧子树的右侧而没有任何命令来指示它转到树的最右侧部分感到困惑和困惑。
-
对
Preorder的每个递归调用都将访问您提供的参数的left和right字段,因此Preorder(node.left);将访问node.left.left和node.left.right,并且那么每个那些字段将被递归访问(直到遇到null)。
标签: java algorithm recursion binary-search-tree