• 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;
        }
    };
  • 相关阅读:
    asp.net编程基础
    http://blog.csdn.net/pjw100/article/details/5261582
    英雄无敌3版的仙剑奇侠传
    另类DATAGRID数据编辑修改
    使用INDY组件发送邮件,DEMO程序没有讲到的一些内容.如邮件格式定议
    .net 简单实现MD5
    VB.NET 对于类型的传递按值或者按引用
    Start with Database Connection Pool 连接管理
    ASP页面之间传值
    正则表达式
  • 原文地址:https://www.cnblogs.com/zhengmeisong/p/10303127.html
Copyright © 2020-2023  润新知