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)/;
p = new TreeNode(vec[m]);
recurCreate(p->left, vec, l, m);
recurCreate(p->right, vec, m+, r);
}
}
正确的写法:
void recurCreate(TreeNode* p, vector<int>& vec, int l, int r){
if (l>=r) return;
else {
int m = l+(r-l)/;
p = new TreeNode(vec[m]);
recurCreate(p->left, vec, l, m);
recurCreate(p->right, vec, m+, r);
}
}
指针初始化
TreeNode* sortedArrayToBST(vector<int> &nums) {
if(nums.size()==) return nullptr;
TreeNode* root = new TreeNode(); //新建一个树节点,同时在内存中分配一个地址给它,root指向该地址
TreeNode* root1; //root1指向八荒之外的某个地址(未初始化局部变量,应避免此操作)
root1->val = ;
TreeNode* root2 = nullptr; //root2是个空指针,没有指向哪里
root1->val = ; //空指针是没有内容的,因此这里调用nullptr->val是错的 错的 错的
recurCreate(root, nums, , static_cast<int>(nums.size()) ); //递归建立BST,返回root地址
recurCreate(root1, nums, , static_cast<int>(nums.size()) ); //root1里啥也没有
recurCreate(root1, nums, , 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)/;
p->val = vec[m];
if(l<m){
p->left = new TreeNode();
recurCreate(p->left, vec, l, m);
}
if(m+<r){
p->right = new TreeNode();
recurCreate(p->right, vec, m+, r);
}
}
}
TreeNode* sortedArrayToBST(vector<int> &nums) {
if(nums.size()==) return nullptr;
TreeNode* root = new TreeNode();
recurCreate(root, nums, , static_cast<int>(nums.size()) );
return root;
}
};
c++算法实现(一) - 递归和初始化的更多相关文章
- 算法基础_递归_求杨辉三角第m行第n个数字
问题描述: 算法基础_递归_求杨辉三角第m行第n个数字(m,n都从0开始) 解题源代码(这里打印出的是杨辉三角某一层的所有数字,没用大数,所以有上限,这里只写基本逻辑,要符合题意的话,把循环去掉就好) ...
- Java实现 蓝桥杯VIP 算法训练 非递归(暴力)
试题 算法训练 非递归 问题描述 当x>1时,Hermite多项式的定义见第二版教材125页.用户输入x和n,试编写"非递归"函数,输出对应的Hermite多项式的值.其中x ...
- C#算法基础之递归排序
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 汉诺塔(河内塔)算法 ----C语言递归实现
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子, 在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺 ...
- 算法打基础——符号&递归解法
第二节 算法复杂度分析的的基本符号及 递归关系式下的复杂度解法 这次的主要知识点是: 1.各种复杂度符号 2.递归复杂度解法: 分为三种 替换法(猜!) 递归树法 主定理 1各种复杂度符号 ...
- 算法笔记_017:递归执行顺序的探讨(Java)
目录 1 问题描述 2 解决方案 2.1 问题化简 2.2 定位输出测试 2.3 回顾总结 1 问题描述 最近两天在思考如何使用蛮力法解决旅行商问题(此问题,说白了就是如何求解n个不同字母的所有不同排 ...
- 【PyQt】算法-插入、递归、冒泡
# coding=utf-8 import sys from PyQt4.QtGui import * from PyQt4.QtCore import * class MainWindow(QMai ...
- [图解算法] 归并排序MergeSort——<递归与分治策略>
#include"iostream.h" void Merge(int c[],int d[],int l,int m,int r){ ,k=l; while((i<=m)& ...
- python 下的数据结构与算法---5:递归(Recursion)
定义:递归就是不断分割整体成部分直到可以轻易解决分割出来的部分. 递归表达式三定律: 1:递归表达式必须有个最小单元 (最小单元既是停止递归调用以及能够直接运算的) 2:递归表达式在运算过程中 ...
随机推荐
- ActiveMq实例
1.发布端 import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.DeliveryMode ...
- CentOS下的Mysql的安装和使用
1.使用安装命令 :yum -y install mysql mysql-server mysql-devel 安装完成却发现Myserver安装缺失,在网上找原因,原来是因为CentOS 7上把My ...
- 配置NTP网络时间自动校对系统时间和创建备份文件
1 案例1:配置用户和组账号 1.1 问题 本例要求创建下列用户.组以及组的成员关系: 新建用户 alex,其用户ID为3456,密码是flectrag 创建一个名为 adminuser 的组 创建一 ...
- js 检查登录态方法封装(闭包、状态缓存)
前端页面开发时,经常需要异步校验登录态,每次都重新copy之前写的方法,比较繁琐不好维护,固将登录态校验封装成一个js. (function(){ //登录状态 1 登录态有效 2 登录态无效 3 请 ...
- APP偏移地址
配合BootLoader的APP程序 SCB->VTOR = 0x0803C004; 这里最后还要加上4的原因是 向量表的复位向量地址是4 0地址存的是栈顶
- linux1
虚拟内存:内核通过磁盘上的存储空间来实现虚拟内存,这块区域称为交换空间.内核不断交换空间和实际的物理内存之间反复交换虚拟内存中的内容 linux运行中的程序叫做进程. 内核创建了第一个进程,叫做Ini ...
- nvwgf2umx.dll 显卡崩溃问题尝试修复
问题背景 游戏上线之后,搜集到的奔溃列表里面列表存在大量的显卡驱动异常崩溃,window在vista之后,将显卡驱动模型从Xpdm改为了WDDM. WDDM的说明详见百度百科,其中最主要的变更如下: ...
- SQL的几种连接:内连接、外连接(左连接、右连接、全连接)
表结构见前面博客 1.内连接 1.1.等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列. 三种写法: select * from t ...
- Java学习之--List和ArrayList
首先明确: List是一个接口,不能被创造实例对象 ArrayList是List 接口的一个实现类,ArrayList类实现了List接口(List接口有多个实现类,例如ArrayList,Linke ...
- 加壳软件-Virbox Protector Standalone
Virbox Protector Standalone 加壳工具 防止代码反编译,更安全,更方便 产品简介 Virbox Protector Standalone提供了强大的代码虚拟化.高级混淆与智能 ...