c++算法实现(一) - 递归和初始化

递归

 写递归函数经常出错,提醒自己两个规则:

1. 一般来说递归函数中不应该出现for、while之类的循环语句, 因为递归就是循环的另外一种实现;

2. 注意基线条件,具体参考《算法图解》p32。

一个死循环的递归:

    void recurCreate(TreeNode* p, vector<int>& vec, int l, int r){
        while (l<r) {
            int m = l+(r-l)/2;
            p = new TreeNode(vec[m]);
            recurCreate(p->left, vec, l, m);
            recurCreate(p->right, vec, m+1, r);
        }
    }

正确的写法:

    void recurCreate(TreeNode* p, vector<int>& vec, int l, int r){
        if (l>=r) return;
        else {
            int m = l+(r-l)/2;
            p = new TreeNode(vec[m]);
            recurCreate(p->left, vec, l, m);
            recurCreate(p->right, vec, m+1, r);
        }
    }

指针初始化

TreeNode* sortedArrayToBST(vector<int> &nums) {
        if(nums.size()==0) return nullptr;
        TreeNode* root = new TreeNode(0);      //新建一个树节点,同时在内存中分配一个地址给它,root指向该地址
        TreeNode* root1;                       //root1指向八荒之外的某个地址(未初始化局部变量,应避免此操作)
        root1->val = 1;
        TreeNode* root2 = nullptr;             //root2是个空指针,没有指向哪里
        root1->val = 2;                        //空指针是没有内容的,因此这里调用nullptr->val是错的 错的 错的
        recurCreate(root, nums, 0, static_cast<int>(nums.size()) );   //递归建立BST,返回root地址
        recurCreate(root1, nums, 0, static_cast<int>(nums.size()) );  //root1里啥也没有
        recurCreate(root1, nums, 0, static_cast<int>(nums.size()) );
        return root;
}                    

未初始化变量的问题参考:C/C++中已初始化/未初始化全局/静态/局部变量/常量在内存中的位置

 

备注:

本是毫不相关的两个问题,刚好在同一道题里遇到了,leetcode108,完整代码如下:

class Solution {
public:
    void recurCreate(TreeNode* p, vector<int>& vec, int l, int r){   
        if (l>=r) {
            return;
        }
        else {
            int m = l+(r-l)/2;
            p->val = vec[m];
            if(l<m){
                p->left = new TreeNode(0);
                recurCreate(p->left, vec, l, m);
            }
            if(m+1<r){
                p->right = new TreeNode(0);
                recurCreate(p->right, vec, m+1, r);
            }
        }
    }
    TreeNode* sortedArrayToBST(vector<int> &nums) {
        if(nums.size()==0) return nullptr;
        TreeNode* root = new TreeNode(0);
        recurCreate(root, nums, 0, static_cast<int>(nums.size()) );
        return root;
    }
};

 

posted @ 2019-01-22 13:08  tszs_song  阅读(877)  评论(0编辑  收藏  举报