Pointers 二叉搜索树递归混淆
我认为这是一个愚蠢的问题,但很抱歉,这将消除我的困惑。 如果你看看这段代码Pointers 二叉搜索树递归混淆,pointers,recursion,data-structures,binary-search-tree,traversal,Pointers,Recursion,Data Structures,Binary Search Tree,Traversal,我认为这是一个愚蠢的问题,但很抱歉,这将消除我的困惑。 如果你看看这段代码 void printInOrder(){ printPrivateInOrder(root); } void printPrivateInOrder(Node* n){ if (root != NULL){ if (n->left != NULL){ printPrivateInOrder(n->left);
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";
}
}
void printInOrder(){
printPrivateInOrder(根);
}
无效printPrivateInOrder(节点*n){
if(root!=NULL){
如果(n->left!=NULL){
printPrivateInOrder(n->左);
}
cout val right!=空){
printPrivateInOrder(n->右侧);
}
}
否则{
cout当你递归到下一个级别时,基本上就是拍下你所在位置的快照,然后去做其他事情。一旦“其他事情”完成,你就回到快照继续
这与调用非递归函数非常相似。当函数调用xyzy()
时,它确切地知道调用返回时从何处继续。递归函数是相同的,只是它们在向下和向后的过程中都通过相同的代码段
因此,当您返回到某个级别(例如,处理了左侧的节点)时,您将打印当前节点,然后转到子树的右侧
考虑示例树:
2
/ \
1 4
/ \
3 5
\
6
要处理此树,对于每个节点(从两个节点开始),处理左侧节点,打印当前节点值,然后处理右侧节点
但是,您需要了解,“处理左/右节点”是在其中一个子节点上重复的整个“处理左、打印当前、处理右”步骤集。从这个意义上讲,处理根节点和处理任何其他节点之间没有区别
“处理”是按顺序打印出给定点(包括该点)下的所有节点。如果从根节点开始,则得到整个树,这是一个令人高兴的效果:-)
因此,就实际发生的情况而言,它基本上遵循递归路径:
2, has a left node 1, process it:
| 1, has no left node.
> | 1, print 1.
| 1, has no right node.
| 1, done.
> 2, print 2.
2, has a right node 4, process it.
| 4, has a left node 3, process it.
| | 3, has no left node.
> | | 3, print 3.
| | 3, has no right node.
| | 3, done.
> | 4, print 4.
| 4, has a right node 5, process it.
| | 5, has no left node.
> | | 5, print 5.
| | 5, has a right node 6, process it.
| | | 6, has no left node.
> | | | 6, print 6.
| | | 6, has no right node.
| | | 6, done.
| | 5, done.
| 4, done.
2, done.
如果检查每个打印行(请参阅
标记),你会看到它们按所需的顺序出现。你的答案很棒,它的工作方式与你说的相同,但是,如果我再回过头来看,2,有一个左节点1,处理它:1,没有左节点。1,打印1。1,没有右节点。2,打印2。
2,有一个左节点1,我们移动到1,我们处理了1,但我们如何移动到2和pri你能再解释一下吗@pexdiablo@Fawad,我修改了前几段,希望能澄清一下。您知道返回并打印2
的方式是因为递归操作保存了当前状态,以便稍后恢复。