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
的方式是因为递归操作保存了当前状态,以便稍后恢复。