递归算法

实现一个二叉搜索树(JavaScript 版)

こ雲淡風輕ζ 提交于 2020-03-13 17:21:37
二叉树在计算机科学中应用很广泛,学习它有助于让我们写出高效的插入、删除、搜索节点算法。二叉树的节点定义:一个节点最多只有两个节点,分别为左侧节点、右侧节点。 二叉搜索树是二叉树中的一种,在二叉搜索树中每个父节点的键值要大于左边子节点小于右边子节点。下图展示一颗二叉搜索树。 二叉搜索树实现大纲 本文将使用 JavaScript 语言,实现一个二叉搜索树,以下为实现的方法: constructor():构造函数,初始化一个二叉搜索树 insert(value):二叉树中查找一个节点,如果存在返回 true 否则返回 false preOrderTraverse(cb):先序遍历或称前序遍历 inOrderTraverse(cb):中序遍历 postOrderTraverse(cb):后序遍历 minNodeValue():最小节点值 maxNodeValue():最大节点值 removeNode(value):移除节点 destory():销毁节点 注意 :在实现二叉树搜索 在这里插入代码片 的很多方法中我们将使用大量的递归操作,如果对它不了解的,可以自行查阅资料学习。 初始化一个二叉搜索树 声明一个 BST 类,在构造函数的 constructor() 里声明它的结构: class BST { constructor () { this.root = null; // 初始化根节点

转:经典ACM算法

荒凉一梦 提交于 2020-03-13 07:15:47
实验一 统计数字问题 实验二 最大间隙问题 实验三 众数问题 实验四 半数集问题 实验五 集合划分问题 实验六 最少硬币问题 实验七 编辑距离问题 实验八 程序存储问题 实验九 最优服务次序问题 实验十 汽车加油问题 实验十一 工作分配问题 实验十二 0-1背包问题 实验十三 最小重量机器设计问题 实验十四 最小权顶点覆盖问题 实验十五 集合相等问题 实验十六 战车问题 实验一 统计数字问题 1、问题描述: 一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1, 2,…,9。 2、题目分析: 考虑由0,1,2,…,9组成的所有n位数。从n个0到n个9共有个n位数,在这些n位数中,0,1,2,…,9每个数字使用次数相同,设为。 满足如下递归式: 由此可知,。 据此,可从低位向高位进行统计,再减去多余的0的个数即可。 3、算法设计: 定义数组a[10]存放0到9这10个数出现的次数,个位为第0位,第j位的数字为r。采用while循环从低位向高位统计: a. 统计从个位算起前j位0~9个数; b. 如果j+1位为0,去掉第j+1位补0个数; c. 统计第j+1位出现1~(r-1)个数; d.

快速排序算法的递归与非递归

◇◆丶佛笑我妖孽 提交于 2020-03-11 12:59:18
//quick sort void quicksort (int array[], int low, int high){ if(low<high){ int index = getindex(array,low,high); quicksort(array,index+1,high); quicksort(array,0,high); } } int getindex(int array[],int low, int high){ int temp = array[low]; while (low<high){ if(array[high] >temp ){ high --; } array[low] = array[high]; if(array[low]<temp){ low++; } array[high] = array[low]; } array[low] =temp; return low; } //非递归的形式来实现快排 void quichsortnorecusive(int array[],int low,int high[]){ stack<int> s; s.push(low); s.push(high); while(!s.empty()){ int h = s.top(); s.pop(); int l = s.top(); s.pop(); int

oracle中 connect by prior 递归算法

一笑奈何 提交于 2020-03-10 17:11:14
Oracle中start with...connect by prior子句用法 connect by 是结构化查询中用到的,其基本语法是: select ... from tablename start with 条件1 connect by 条件2 where 条件3; 例: select * from table start with org_id = 'HBHqfWGWPy' connect by prior org_id = parent_id; 简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段: org_id,parent_id那么通过表示每一条记录的parent是谁,就可以形成一个树状结构。 用上述语法的查询可以取得这棵树的所有记录。 其中: 条件1 是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。 条件2 是连接条件,其中用PRIOR表示上一条记录,比如 CONNECT BY PRIOR org_id = parent_id就是说上一条记录的org_id 是本条记录的parent_id,即本记录的父亲是上一条记录。 条件3 是过滤条件,用于对返回的所有记录进行过滤。 简单介绍如下: 早扫描树结构表时,需要依此访问树结构的每个节点,一个节点只能访问一次,其访问的步骤如下: 第一步:从根节点开始; 第二步:访问该节点; 第三步

【Java数据结构+算法】递归-----八皇后问题(分析与实现)

陌路散爱 提交于 2020-03-10 07:53:52
一、八皇后问题描述 八皇后问题,是一一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯.贝瑟尔于1848年提出 : 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击, 即:任意两个皇后都不能处于同一行、同一-列或同-斜线上 ,问有多少种摆法。 二、八皇后问题思路分析 (使用到回溯算法) (1)、第一个皇后先放第一行第- -列 (2)、第二个皇后放在第二行第一列、然后判断是否0K,如果不0K, 继续放在第二列、第三列、依次把所有列都放完,找到一个合适的位置 (3)、继续第三个皇后,还是第一列、第二列…直到第8个皇后也能放在一个不冲突的位置,算是找到了一个正确解。 (4)、当得到一个正确解时,在栈回退到上一一个栈时,就会开始回溯,即将第一个皇后,放到第一-列的所有正确解,全部得到。 (5)、然后回头继续第一个皇后放第二列,后面继续循环执行1,2,3的步骤。 说明:本来应该创建一-个二维数组来表示棋盘,但是实际上可以通过算法,用一个 一维数组 即可解决问题。 比如:arr = {0,4,7,5,2,6,1,3}: ①数组下标+1:表示行的位置 ②数组元素+1:表示列的位置 比如0:第一行第一列 4:第二行第五列 三、代码实现 package com . ycx . recursion ; import java . util . Queue ; public

分治思想与归并排序

主宰稳场 提交于 2020-03-09 22:00:04
分治法 的思想: 将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些自问题,然后再合并这些自问题的解来建立原问题的解。 分支模式在每层递归时都有三个步骤: 分解 原问题为若干子问题,这些子问题是原问题的规模较小的实例。 解决 这些子问题,递归地求解各子问题。然而,若子问题的规模足够小,则直接求解。 合并 这些子问题的解成原问题的解。 归并排序 算法完全遵循分治模式。直观上其操作如下: 分解: 分解待排序的n个元素的序列成各具n/2个元素的两个子序列。 解决: 使用归并排序递归地排序两个子序列。 合并: 合并两个已排序的子序列以产生已排序的答案。 参考: 《算法导论》中文版原书第3版Page16,17 来源: https://www.cnblogs.com/drfxiaoliuzi/p/5892158.html

C语言函数3

前提是你 提交于 2020-03-09 06:52:02
函数递归 递归定义: 程序调用自身的编程技巧称为递归( recursion)。 递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。 递归的主要思考方式在于: 把大事化小 递归的必要条件: 存在限制条件,当满足这个限制条件的时候,递归便不再继续。 每次递归调用之后越来越接近这个限制条件。 递归函数举例: 接受一个整型值(无符号),按照顺序打印它的每一位。 解析: 如输入1234,要使按顺序输出1 2 3 4 函数带入参数(1234) 由于1234不是单个数字,则进入向内层 递 的过程(给1234/10) 再次带入参数(123) 由于123不是单个数字,则进入向内层 递 的过程(给123/10) 再次带入参数(12) 由于12不是单个数字,则进入向内层 递 的过程(给12/10) 再次带入参数(1) 由于1是单个数字,则进行打印并向外层 归 的过程。 代码: # include <stdio.h> void print ( int n ) { if ( n > 9 ) { print ( n / 10 ) ; } printf ( "%d " , n % 10 ) ;

《算法图解》笔记

爷,独闯天下 提交于 2020-03-09 03:38:22
看书还得写笔记,文字的写不来,还是写电子的,自己的字跟狗爬一样,打出来的字好多了。 后续把自己看的基本关于网络的书也写点博客,一便于查寻,二便于加强记忆,要不然跟小说一样,看了就忘了。 第1章:算法介绍 理解大O表示法,并非以秒为单位。大O表示法让你能够比较操作数,它指出了算法运行时间的增速。 大O表示法说的是在查找情况中最糟的情形。 从快到慢晕倒的5种大O运行时间。 O(log n),也叫对数时间,这样的算法包括二分查找。 O(n), 也叫线性时间,这样的算法包括简单查找。 O(n * log n),这样的算法包括快速排序---一种比较快的排序算法 O(n2)【表示n的平方】, 这样的算法包括选择排序---一种速度较慢的排序算法 O(n!), 这样的算法包括旅行商的解决方案---一种非常慢的算法 第一章主要理解: 算法的速度指的并非时间,而是操作数的增速。 讨论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加。 算法的运行时间用大O表示法表示。 O(log n)比O(n)快,当需要搜索的元素越多时,前者比后者快很多。 小结: 二分查找的速度比简单查找快很多。 O(logn)比O(n)快。需要搜索的元素越多,前者比后者就快得更多 算法运行时间并不以秒为单位。 算法运行时间是从其增速的角度度量的。 算法运行时间用大O表示法表示 最后上书中的二分查找代码 def

递归,贪心

我的未来我决定 提交于 2020-03-09 00:25:47
递归 递归算法是指程序直接或间接调用自身的技巧;他通常把一个大型复杂问题层层转化为一个与原问题相似的规模较小的问题来求解。其基本思想为层层分解,关键在于找出递归定义和终止条件。 例题 G:括号匹配问题 字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$“标注,不能匹配的右括号用”?"标注. Input 输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100 注意:cin.getline(str,100)最多只能输入99个字符! Output 对每组输出数据,输出两行,第一行包含原始输入字符,第二行由" " , " ? " 和 空 格 组 成 , " ","?"和空格组成," " , " ? " 和 空 格 组 成 , " “和”?"表示与之对应的左括号和右括号不能匹配。 SAMPLE INPUT ((ABCD(x) )(rttyy())sss)( SAMPLE OUTPUT ((ABCD(x) $$ )(rttyy())sss)( ? ?$ 为解决此问题引入STACK函数 # include <iostream> # include

递归算法总结

风格不统一 提交于 2020-03-08 14:52:37
递归算法就是把一个大型复杂问题分解为小问题,而递归的关键就是找出递归定义和终止条件。 递归算法的解题步骤: 第一,分析问题,寻找大规模问题与小型问题的联系。 第二,控制递归,找出终止条件。 第三,设计函数,实现有关操作。 例如 1.求1-100的和 递归:f(n)=n+f(n-1); 终止条件:if(n==1)return 1; 函数实现 int f ( int n ) { if ( n == 1 ) return 1 ; return f ( n - 1 ) + n ; } 2.辗转相除法的递归实现 int gcd ( int m , int n ) { if ( n == 0 ) return m ; return gcd ( n , m % n ) } 3.快速幂实现 typedef long long ll ; ll f ( ll int a , int b ) { if ( b % 2 ) return ( a * f ( a , b - 1 ) ) ; ll n = f ( a , b / 2 ) ; //进行优化,减少计算次数 return n * n ; } 4.全排列问题 先把高位排好,再关注少一位的排列情况; 高位有若干种情况,就需要将问题化为多个子问题。每个子问题都与高位的排列有关; 要列举出所有高位的情况,以确定子问题; 需要离散枚举! //产生从元素k