设计一个递归程序

时间:2016-04-28 22:52:34

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

我不是编程的新手,我已经编程了近三年了。但我仍然对理解和设计递归程序感到沮丧。有时我需要写下整个过程,这需要花费很多时间。 说这个程序: 将排序数组转换为平衡二进制搜索树

TreeNode* sortedArrayToBST(vector<int>& nums) {
        return help(nums, 0, nums.size()-1);
    }

    TreeNode* help(vector<int> &nums, int start, int end){
        int size=end-start;
        if(size<0)    return NULL;
        if(size==0)    return new TreeNode(nums[start]);
        int mid=(start+end)/2;
        TreeNode* root=new TreeNode(nums[mid]);
        root->left=help(nums, start, mid-1);
        root->right=help(nums, mid+1, end);
        return root;
    }

我很难跟踪树的形成方式......我绝对不能自己设计这样的程序。我已经看过30个递归程序,我知道我需要多练习才能熟悉它。想要了解设计递归程序时的思维过程以及如何快速理解递归程序。 非常感谢!!

1 个答案:

答案 0 :(得分:3)

当你处理递归时,你需要牢记四件事:

  • 定义当前状态的参数是什么。
  • 结束条件是什么。
  • 通话回来了什么。
  • 如何组合递归调用的结果以产生当前调用的答案。

在你提到的情况下。

  • 参数是列表一部分的坐标(开始,结束)。
  • 结束条件:如果列表中有一个元素,则返回一个只包含该元素的树,列表部分为空,返回null。
  • 返回的结果:根完全构建的平衡树,表示参数列表中的部分。
  • 如何组合结果:拿起中间点并使其成为树的根。将左子项设置为起始点和中间点之间的子节的树的根(该列表的递归调用)。将正确的子项设置为树的根,用于中间点和列表末尾之间的子节(对该列表的递归调用)。

只要你清楚这4点,大多数递归问题就变得简单了。如果你想要更好地完成它,你需要练习更多涉及递归的问题。