递归

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

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

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

一个死循环的递归:

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

正确的写法:

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

指针初始化

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

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

备注:

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

  1. class Solution {
  2. public:
  3. void recurCreate(TreeNode* p, vector<int>& vec, int l, int r){
  4. if (l>=r) {
  5. return;
  6. }
  7. else {
  8. int m = l+(r-l)/;
  9. p->val = vec[m];
  10. if(l<m){
  11. p->left = new TreeNode();
  12. recurCreate(p->left, vec, l, m);
  13. }
  14. if(m+<r){
  15. p->right = new TreeNode();
  16. recurCreate(p->right, vec, m+, r);
  17. }
  18. }
  19. }
  20. TreeNode* sortedArrayToBST(vector<int> &nums) {
  21. if(nums.size()==) return nullptr;
  22. TreeNode* root = new TreeNode();
  23. recurCreate(root, nums, , static_cast<int>(nums.size()) );
  24. return root;
  25. }
  26. };

c++算法实现(一) - 递归和初始化的更多相关文章

  1. 算法基础_递归_求杨辉三角第m行第n个数字

    问题描述: 算法基础_递归_求杨辉三角第m行第n个数字(m,n都从0开始) 解题源代码(这里打印出的是杨辉三角某一层的所有数字,没用大数,所以有上限,这里只写基本逻辑,要符合题意的话,把循环去掉就好) ...

  2. Java实现 蓝桥杯VIP 算法训练 非递归(暴力)

    试题 算法训练 非递归 问题描述 当x>1时,Hermite多项式的定义见第二版教材125页.用户输入x和n,试编写"非递归"函数,输出对应的Hermite多项式的值.其中x ...

  3. C#算法基础之递归排序

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. 汉诺塔(河内塔)算法 ----C语言递归实现

    汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子, 在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺 ...

  5. 算法打基础——符号&递归解法

    第二节 算法复杂度分析的的基本符号及 递归关系式下的复杂度解法 这次的主要知识点是: 1.各种复杂度符号  2.递归复杂度解法: 分为三种 替换法(猜!)   递归树法    主定理 1各种复杂度符号 ...

  6. 算法笔记_017:递归执行顺序的探讨(Java)

    目录 1 问题描述 2 解决方案 2.1 问题化简 2.2 定位输出测试 2.3 回顾总结 1 问题描述 最近两天在思考如何使用蛮力法解决旅行商问题(此问题,说白了就是如何求解n个不同字母的所有不同排 ...

  7. 【PyQt】算法-插入、递归、冒泡

    # coding=utf-8 import sys from PyQt4.QtGui import * from PyQt4.QtCore import * class MainWindow(QMai ...

  8. [图解算法] 归并排序MergeSort——<递归与分治策略>

    #include"iostream.h" void Merge(int c[],int d[],int l,int m,int r){ ,k=l; while((i<=m)& ...

  9. python 下的数据结构与算法---5:递归(Recursion)

    定义:递归就是不断分割整体成部分直到可以轻易解决分割出来的部分. 递归表达式三定律: 1:递归表达式必须有个最小单元     (最小单元既是停止递归调用以及能够直接运算的) 2:递归表达式在运算过程中 ...

随机推荐

  1. django 小东小西

    1.request.META里包含了哪些数据? request.META 是一个Python字典,包含了所有本次HTTP请求的Header信息,比如用户IP地址和用户Agent(通常是浏览器的名称和版 ...

  2. angular.isFunction()

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. EF Core 相关的千倍性能之差: AutoMapper ProjectTo VS Mapster ProjectToType

    在前两天遇到 .NET Core 中 EF Core 的异步与同步查询的百倍性能之差(详情之前的博文)之后,这两天又遇到了 AutoMapper ProjectTo<T> 与 Mapste ...

  4. Windows 安装JDK

    Windows 安装JDK jdk为java开发工具,jre为java运行环境,安装一个jdk版本会把两个一起装 步骤: 1.在官网下载jdk:http://www.oracle.com/techne ...

  5. RxSwift 操作符

    RxSwift 操作符 (throttle) https://blog.csdn.net/weixin_38318852/article/details/80334838 RxSwift 操作符 (w ...

  6. Lambda Expression

    Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁.当开发者在编写Lambda表达式时,也会随之被编译成一个函数式接口.下面这个例子就是使用Lambda语法来代替匿名的内部类 ...

  7. 实验八 Web基础 SQL注入原理

    实验八 Web基础 实验要求 (1)Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. (2)Web前端javascipt ...

  8. python 包下载地址

    https://www.lfd.uci.edu/~gohlke/pythonlibs/

  9. linux内核态和用户态的信号量

    在Linux的内核态和用户态都有信号量,使用也不同,简单记录一下. 1> 内核信号量,由内核控制路径使用.内核信号量是struct semaphore类型的对象,它在中定义struct sema ...

  10. Spark架构原理