如何在递归调用之间维护状态

时间:2015-07-16 23:01:27

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

以下是我要解决的问题: 在二进制搜索树中找到第k个最小整数:

我的算法:我将对BST进行顺序遍历。每次我访问节点时,我都会将k减1,当k = 0时,我应该在第k个最小节点。

这是我的实施:

void FindKthSmallest(struct TreeNode* root, int k)
{
  if (root == NULL) return;
  if (k== 0) return;
  FindKthSmallest (root->left, k);
  k--;
  if (k == 0)
  {
    cout << root->data;
    return;
  }
  FindKthSmallest (root->right, k);
}

然而,通过上述实现,我发现在递归调用之间不能保持k的状态。

我认为k的状态需要在两种情况下维持:子和父之间的递归调用返回以及父对子之间的递归调用 - 这是我正在努力的地方。有没有办法在这种情况下维持状态?

1 个答案:

答案 0 :(得分:0)

在您的实现中,您使用变量k传递两条不同的信息:

  1. 找到目标节点之前的剩余节点数。
  2. 如果已找到目标节点。
  3. 缺少的只是2.你可以通过以下方式实现这一目标:

    i)传递k作为参考而不是值。

    ii)通过0的值k指定上述2.)的含义。

    结果如下:

    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);
        }
      }
    }
    

    另请注意,上述实施是O(k)。使用BST,您实际上可以在查找k-th最小整数时获得更好的性能。