二叉搜索树递归混淆

时间:2016-12-23 02:31:56

标签: 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);
            }
            cout << n->val << " ";
            if (n->right != NULL){
                printPrivateInOrder(n->right);
            }
        }
        else{
            cout << "Tree is Empty\n";
        }
    }

在这个Traversal中,如果我们去最左边的孩子,那么如何再次调用这个函数?假设只看到图片 BST Example 我们已经转移到节点4,那么如何再次调用此函数?如果两个子节点都为空,我不会再次调用此函数,但是再次调用此函数并打印InOrder Traversal中的所有节点?怎么样?

1 个答案:

答案 0 :(得分:1)

当你递归到下一个级别时,这基本上涉及拍摄你的确切位置的快照,然后去做其他事情。一旦那个&#34;别的&#34;完成后,您将返回快照并继续。

与调用 - 递归函数非常相似。当函数调用xyzzy()时,它会确切地知道从调用返回时继续执行的位置。递归函数是相同的,只是它们在向下和向后的路上都通过相同的代码片段。

所以,当你回来 up 一个级别(例如,已经处理了左边的节点),然后你将打印当前节点,然后沿着子节点的右侧向下移动树。

考虑样本树:

  2
 / \
1   4
   / \
  3   5
       \
        6

要处理此树,请为每个节点(从2开始)处理左节点,打印当前节点值,然后处理正确的节点。

但是,您需要了解&#34;处理左/右节点&#34;是整个&#34;流程,打印当前,流程正确&#34;其中一个孩子再次上台阶。从这个意义上说,处理根节点和处理任何其他节点之间存在 no 的区别。

&#34;处理&#34;是按顺序打印给定点(包括该点)下的所有节点。它只是一个快乐的效果,如果你从根节点开始,你得到整个树: - )

因此,就实际发生的情况而言,它基本上遵循递归路径:

  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.

如果您检查每条打印行(请参阅>标记),您会看到它们按所需顺序出现。