我认为这是一个愚蠢的问题但很遗憾地说它会清除我的困惑 . 如果您只是查看此代码
void printInOrder(){
printPrivateInOrder(root);
}
void printPrivateInOrder(Node* n){
if (root != NULL){
if (n->left != NULL){
printPrivateInOrder(n->left);
}
cout << n->val << " ";
if (n->right != NULL){
printPrivateInOrder(n->right);
}
}
else{
cout << "Tree is Empty\n";
}
}
在这个遍历中,如果我们去最左边的孩子,那么如何再次调用这个函数?假设只看到图片BST Example我们已经移动到节点4,那么如何再次调用此函数?如果两个子节点都为空,我不会再次调用此函数,但是再次调用此函数并打印InOrder Traversal中的所有节点?怎么样?
1 回答
当你递归到下一个级别时,这基本上涉及拍摄你的确切位置的快照,然后去做其他事情 . 完成“其他”后,您将返回快照并继续 .
它与调用非递归函数非常相似 . 当一个函数调用
xyzzy()
时,它会确切地知道从调用返回时继续执行的位置 . 递归函数是相同的,只是它们在向下和向后的路上都经过相同的代码片段 .因此,当您返回某个级别(例如,已经处理了左侧的节点)时,您将打印当前节点,然后沿着子树的右侧向下移动 .
考虑示例树:
要处理此树,请为每个节点(从2开始)处理左节点,打印当前节点值,然后处理右节点 .
但是,您需要了解"process the left/right node"是其中一个子项上的整个"process left, print current, process right"步骤 . 从这个意义上说,处理根节点和处理任何其他节点之间没有区别 .
“处理”是按顺序打印出给定点(包括该点)下的所有节点 . 这只是一个快乐的效果,如果你从根节点开始,你得到整个树:-)
因此,就实际发生的情况而言,它基本上遵循递归路径:
如果您检查每条打印行(请参阅
>
标记),您将看到它们按所需顺序出现 .