zoukankan      html  css  js  c++  java
  • 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;
        }
    };
  • 相关阅读:
    Encoding
    F Takio与Blue的人生赢家之战
    D FFF团的怒火
    C Golden gun的巧克力
    B 倒不了的塔
    A jubeat
    17230 计算轴承半径
    10686 DeathGod不知道的事情
    10688 XYM-AC之路
    10692 XYM-入门之道
  • 原文地址:https://www.cnblogs.com/zhengmeisong/p/10303127.html
Copyright © 2011-2022 走看看