递归

数据结构——二叉树(基础)

巧了我就是萌 提交于 2020-02-04 05:02:30
1、树存在意义: 1)数组的存储方式的分析 优点:通过下标方式访问元素,速度快,对于有序数组,还可使用二分查找提高检索速度。 缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率低。 2)链式存储方式的分析 优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,连接到链表即可,删除效率也很好)。 缺点:在进行检索时,效率仍然很低,检索某个值,需要从头节点开始遍历。 3)树的存储方式分析 能提高存储,读取的效率,比如利用二叉排序树(Binary Sort Tree),既可以保证数据的检索速度,同事也可以保证数据的插入,删除,修改的速度 2、树的常用术语: 节点 :如A,B,F分别是树的节点; 根节点 :如A是整棵树的根节点; 父节点 :如B是E的父节点; 子节点 :如E是B的子节点; 叶子节点 :没有子节点的节点,如D.H,F,G都是叶子节点; 权 :若将树中节点赋给一个有着某种含义的数值,则这个数值称为该结点的权; 路径 :从root结点(根节点)找到该节点的路线,如H节点的路径为{A,B,E,H}; 层 :从根开始定义起,根为第一层,根的孩子为第二层。若某节点在第k层,则其子树的就在第k+1 层。如节点E的层数为3; 子树 :如集合{B,D,E,H}为A的一颗子树; 树的高度 :树的最大层数,如示例图树的高度为4; 森林 :是m (m>

python中递归函数的使用

眉间皱痕 提交于 2020-02-03 18:07:11
python中递归函数的使用 递归函数就是自己调用自己的函数,递归函数使用过程中应注意调用深度,否则计算机无法承受。 1.使用递归函数实现计算某个数的阶乘。 def fact ( n ) : if n == 1 : return 1 return n * fact ( n - 1 ) print ( fact ( n ) ) 其中n为某个数。 1.2用递归函数来实现获取斐波拉契数列中的第n个数字的值。 斐波拉契数列特点:从第三个数开始,后一个数等于前面两个数之和。 初始方法: a = 0 b = 1 while a < 1000 : print ( b ) a , b = b , a + b 输出结果: 1 1 2 3 5 8 13 21 34 55 89 144 233 进阶方法: def func ( n ) : if n == 1 or n == 2 : return 1 else : return func ( n - 1 ) + func ( n - 2 ) res = func ( 20 ) print ( res ) 输出结果: 6765 或者: list = [ ] for i in range ( 20 ) : if i == 0 or i == 1 : list . append ( 1 ) else : list . append ( list [ i - 2

蓝桥杯:递归求二进制表示位数

若如初见. 提交于 2020-02-03 17:41:31
问题描述 给定一个十进制整数,返回其对应的二进制数的位数。例如,输入十进制数9,其对应的二进制数是1001,因此位数是4。 样例输入输出 输入 9 输出 4 思路 题目不难,你可以直接对n求对数log 2 n 然后得到结果 ↓ # include <iostream> # include <cmath> using namespace std ; # define log2(x) ((int)(log(x)/log(2))) int main ( ) { int n ; cin >> n ; cout << log2 ( n ) + 1 << endl ; return 0 ; } 但是重点是用 递归的思维 去解决 二进制对应的是一颗二叉树,它的深度就是二进制数的位数 深度为1的层能够表示的数是0,1,这就意味着0,1的二进制长度就是1 同理深度为2的层,能够表示2,3 深度为3:4,5,6,7 深度为4:8,9,10,11,12,13,14,15 对于数字x,想要求它的二进制长度,就是求它在二进制树中能有多深 对于x,x/2必定在树的上一层 这就意味着【数字x的二进制数的长度】是【x/2的二进制数长度】+1 于是可以定义递推式: len ( x ) = len ( x / 2 ) + 1 边界条件:x=0 或 x=1,此时长度为1 完整的递归函数: int binary_len

复习打卡--0809函数进阶

谁说胖子不能爱 提交于 2020-02-03 16:37:08
函数进阶 1、递归函数: 在函数体中调用自身;一定要设置退出的边界条件; def func_add(i): if i==1: return i res=i+func_add(i-1) return res print(func_add(3))   print(sys.getrecursionlimit()) # 查看 递归边界 ,超出时会报错   sys.setrecursionlimit(1000) # 手动设置递归边界   递归函数存在大量的重复计算数据, 使用缓存 可以保留上次计算的结果,大大节省执行时间。 from functools import lru_cache @lru_cache(maxsize=128,typed=False) def func_add(i): if i<=2: return 1 res=func_add(i-1)+func_add(i-2) return res print(func_add(100)) 2、纯函数   函数的返回值只与函数内部参数有关,不受外部环境(如全局变量)影响; 函数调用时不会产生副作用,例如改变外部环境(如全局变量,文件读写);   相同的输入保证有相同的输出;    常用的内置函数: map、filter、zip  def func_map(n): return n*1000/3 res=map(func_map,

MySQL递归查询方法

匆匆过客 提交于 2020-02-03 12:19:17
1. 前言 最近在做项目时,需要用到mysql递归查询,网上搜索关于递归查询的博客有很多,但是多多少少都有些坑,在这里,自己将它重新整理一下,避免自己踩坑,也方便大家遇到这样的问题。让技术人员能够快速的解决问题。 2. 创建数据库 CREATE DATABASE IF NOT EXISTS ` db_recursive ` ; USE ` db_recursive ` ; -- Table structure for table `t_tree` DROP TABLE IF EXISTS ` t_tree ` ; SET character_set_client = utf8mb4 ; CREATE TABLE ` t_tree ` ( ` id ` int ( 11 ) NOT NULL AUTO_INCREMENT , ` name ` varchar ( 45 ) DEFAULT NULL , ` pid ` int ( 11 ) NOT NULL DEFAULT '0' , PRIMARY KEY ( ` id ` ) ) ENGINE = InnoDB AUTO_INCREMENT = 9 DEFAULT CHARSET = utf8 ; LOCK TABLES ` t_tree ` WRITE ; INSERT INTO ` t_tree ` VALUES ( 1 ,

二叉树遍历的递归与非递归写法_C语言

巧了我就是萌 提交于 2020-02-03 12:11:46
前言 中序遍历的非递归写法 后序遍历的非递归写法 完整代码 前言 二叉树的三种遍历的递归写法,只要理解思想,几行代码就可以完成。可是非递归写法却很不容易。这里特地总结下,透彻解析它们的非递归写法。其中,中序遍历的非递归写法最简单,后序遍历最难。 中序遍历的非递归写法 非递归算法,必然要用到栈(可参考完整代码中栈的实现)。这里着重讲下中序遍历的写法。 void InorderTraversal ( BinTree BT ) { BinTree T ; Stack TreeStack ; TreeStack = CreateStack ( ) ; T = BT ; while ( T || ! IsEmpty ( TreeStack ) ) { //注意循环结束的条件 while ( T ) { //将左子树一口气全部入栈 Push ( TreeStack , T ) ; T = T -> Left ; } T = Pop ( TreeStack ) ; // 退出循环时,T为空,即再无左子树 printf ( "%d " , T -> Data ) ; //此时,打印该节点值 T = T -> Right ; //而后,转向右子树,若该节点为叶子节点, //则T仍为空,下一次循环直接出栈, //此处巧妙将叶子节点与常规节点的代码统一 } } 后序遍历的非递归写法

bfs 二叉树 遍历

匆匆过客 提交于 2020-02-03 07:03:48
bfs 遍历二叉树 之前只知道bfs 的思想以及需要使用队列来进行存储 为了更好的理解bfs 手写了bfs 遍历二叉树的两种方式 方法: 一种是采用常用的递归执行 另一种是采用循环执行(使用栈来代替递归) 二叉树定义 class Node { //get set方法省略 private Node leftChild ; private Node rightChild ; private int data ; public Node ( int data ) { this . data = data ; } } 构造二叉树 Node node = new Node ( 1 ) ; node . setLeftChild ( new Node ( 2 ) ) ; node . setRightChild ( new Node ( 3 ) ) ; node . getLeftChild ( ) . setLeftChild ( new Node ( 4 ) ) ; node . getLeftChild ( ) . setRightChild ( new Node ( 5 ) ) ; bfs ( node ) ; 使用bfs 方式一:递归 public static void bfs ( Node node ) { if ( node != null ) { System . out .

python实现二分查找(递归、非递归)

↘锁芯ラ 提交于 2020-02-03 05:47:13
本文用python3实现了二分查找算法,分别使用递归方法和非递归方法。 (一)递归实现 def binarySearch(s, k): return binarySearch_c(s, 0, len(s) - 1, k) def binarySearch_c(s, low, high, k): if low > high: return -1 mid = low + (high - low) // 2 if s[mid] == k: return mid elif s[mid] > k: return binarySearch_c(s, low, mid - 1, k) else: return binarySearch_c(s, mid + 1, high, k) for _ in range(int(input())): s = list(map(int, input().split())) k = int(input()) print(binarySearch(s, k)) (二)非递归实现 def binarySearch(s, k): low = 0 high = len(s) - 1 while low <= high: mid = low + (high - low) // 2 if s[mid] == k: return mid elif s[mid] > k:

你所能用到的数据结构(四)

倖福魔咒の 提交于 2020-02-03 05:38:29
五、如何递,怎样归? 很多人看完递归的原理之后会有这种感觉,喔,这个原理我懂了,然后再找一道其余的题目看一看能不能写的出来,突然发现,我勒个去,还是不会。其实这种现象很普遍,所以如果你是这种的,也没有什么好沮丧的,我敢保证你能看的懂递归的执行过程,基本上已经比30%的人要强了。所以我觉得,我写一写我对递归思维的理解好了。递归这个词我的理解应该是传递和回归,如何把自身的状态传递下去和如何回归到一个结果上是递归问题的基本思维方式。 所谓如何传递,我觉得思维的难点是如何抽象出数学模型,如果是斐波那契数列那种有明确公式的话,很简单,直接按照公式该怎么操作怎么操作,难得是只有叙述性语言的,比如这种题目:有一段楼梯n个阶梯,你可以选择一次上一个阶梯,也可以选择一次上两个阶梯,请问走到顶部一共有多少种走法?看似很高深吧?其实这就是斐波那契数列的一个变体而已。这种描述性的题目如果要抽象出数学模型,我觉得最好的办法就先列举几个试试,先看看有什么规律没有,然后再猜想,再证明。你先看看你上2层楼梯有几种方法,2层楼梯要么是1次性上去,要么分成两步,一次性上一步,于是就是F(2)=2,如果只有一层和没有呢,那明显只有一种走法(一次上一层和不走),也就是F(0)=1,F(1)=1,下面,你要上第三层,你的办法要么是从第二层上一层到第三层,要么是在第一层上两层到第三层,要么一层一层的走上去,这样F(3)=3

数据结构与算法题目集(中文)6-9 二叉树的遍历 (25分)

烂漫一生 提交于 2020-02-03 01:04:39
1.题目链接 https://pintia.cn/problem-sets/15/problems/732 2.题目分析 1.void InorderTraversal( BinTree BT );中序遍历,即“根,左,右” 先输出根节点,再递归进入左节点,之后再递归进入右节点 2.void PreorderTraversal( BinTree BT ); 先序遍历,即“左,跟,右”先递归进入左节点,之后返回一层输出根节点,再递归进入右节点 3.void PostorderTraversal( BinTree BT );后序遍历,即“左,右,跟”先不断递归进入左节点,再分别递归入右节点,之后输出根节点 4.void LevelorderTraversal( BinTree BT );层序遍历,即一层一层从上往下从左往右输出节点 层序遍历具体的实现方法: 声明一个binTree[100]数组,使用head、last两个指针; 首先将根节点输出,并将last指针++,接着将根节点的左、右节点放到数组中进行缓存,同时使last指针++; 下一次再将左节点输出,同时将左节点的左、右节点存入数组,last++,右节点同理; 最后当head与last值相等的时候,表示到达最右下方节点,输出结束。 3.代码 void InorderTraversal( BinTree BT ) { if(BT=