我正在为数据结构类的Red Black树工作。
我有代码:
void printInorder(Node node) //Input is initially the root node
{
if (node == null)
{
return;
}
printInorder(node.left);
System.out.println(node.data);
printInorder(node.right);
}
让我们以二叉树为例:
50
/ \
40 60
/ \ \
20 45 70
/ \ /
43 47 65
代码的输出是正确的,并且是:20 40 43 45 47 50 60 65 70
我对代码的理解是,它会以递归方式调用printInorder(node.left),直到它达到20.
此时,它将打印“20”,然后检查printInorder(node.right),看到它为null并返回到printInorder(node.right)语句,此时它位于方法的底部,没有更多的代码可以运行,因此它退出。
输出正确,但根据我对代码的理解,它应该在打印“20”后停止。
有人可以逐步解释这个递归循环的过程,对我来说是一步一步吗?请假装你正在向有精神障碍的人解释。谢谢。
答案 0 :(得分:2)
有这个笑话"为了理解递归,首先应该理解递归"
首先让我们看看这个功能。它做了什么?
检查是否有左侧节点以及是否存在(尚未打印)
如果没有左节点打印
检查是否有正确的节点然后去那里。
所以在这里执行。
所以它会......
答案 1 :(得分:1)
call printInorder (node 50) // root
call printInorder (40) // left child of 50
call printInorder (20) // left child of 40
call printInorder (null) // left child of 20
print 20
call printInorder (null) // right child of 20
print 40
call printInorder (45) // right child of 40
call printInorder (43) // left child of 45
call printInorder (null) // left child of 43
print 43
call printInorder (null) // right child of 43
print 45
call printInorder (47) // right child of 45
call printInorder (null) // left child of 47
print 47
call printInorder (null) // right child of 47
print 50
call printInorder (60) // right child of 50
...
等等
答案 2 :(得分:0)
我对代码的理解是它会递归调用printInorder(node.left)直到它达到20。
正确。
此时,它将打印" 20"然后它检查printInorder(node.right),看到它为null并返回到printInorder(node.right)语句。 。
这是你错过关键点的地方。
它不会返回printInOrder(node.right)
返回printInOrder(40){ ... System.out.println(node.data); ...}
,然后返回printInOrder(40){ ... printInOrder(node.right); ...}
。