【问题标题】:Recursion and a counter variable in a binary tree二叉树中的递归和计数器变量
【发布时间】:2015-07-19 05:19:39
【问题描述】:

以下是 2 个代码: 1.在二叉搜索树中找到第k个最小的整数:

void FindKthSmallest(struct TreeNode* root, int& k)
{
  if (root == NULL) return;
  if (k == 0) return; // k==0 means target node has been found
  FindKthSmallest (root->left, k);

  if (k > 0) // k==0 means target node has been found
  {
    k--;
    if (k == 0) { // target node is current node
    cout << root->data;
    return;
    } else {
    FindKthSmallest (root->right, k);
    }
  }
}
  1. 求二叉树的节点数:

    int Size (struct TreeNode* root)
    {
      if (root == NULL) return 0;
      int l = Size (root->left);
      int r = Size (root->right);
      return (l+r+1);
    }
    

我的问题: 在这两个代码中,我都必须跟踪我访问的节点数。为什么代码 1 需要通过引用传递参数来跟踪我访问的节点数,而代码 2 不需要通过引用传递任何变量?

【问题讨论】:

    标签: recursion binary-tree binary-search-tree


    【解决方案1】:

    第一个代码 (1) 正在寻找 BST 中的最小节点。您从树左侧的根向下搜索,因为将在该位置找到值最小的节点。您进行了几项检查:

    • root == null - 判断树是否为空。
    • k == 0 - 在这种情况下,零是最小的元素。您是根据这棵树的任何原则做出此假设。

    然后你递归地遍历列表以在树的左侧找到下一个最小的。您再执行一次检查,如果 k &gt; 0 减少 k &lt;- 这就是您需要通过引用传递的原因,因为您正在更改由单独的函数、全局变量等给出的某些值 k。如果 @987654326 @ 恰好为零,那么您找到了最小的值节点,如果不是,则从当前节点的右侧继续该过程。这似乎是一种非常随意的查找最小节点的方式......

    对于第二个代码 (2),您只是从根开始计算树中的节点,然后递归地计算每个后续节点(左或右),直到找不到更多节点。您返回结果,即左节点、右节点的总数。和 + 1 为根,因为它之前没有被计算在内。在这种情况下,不需要通过引用传递变量,但如果您选择这样做,您可能会实现一个。

    这有帮助吗?

    【讨论】:

      【解决方案2】:

      通过引用传递参数允许您跟踪递归过程中的计数,否则计数将重置。它允许您修改内存空间内的数据,从而更改以前的值而不是当前/本地值。

      【讨论】:

        猜你喜欢
        • 2011-02-15
        • 2016-07-20
        • 2016-04-19
        • 2014-03-29
        • 1970-01-01
        • 2012-10-29
        • 1970-01-01
        • 2020-02-21
        • 2016-01-17
        相关资源
        最近更新 更多