递归

剑指offer第二版-总结:二叉树的遍历

你离开我真会死。 提交于 2020-02-09 07:49:55
思想:前序(根左右),中序(左根右),后序(左右根) 前序非递归遍历: 首先判断根是否为空,将根节点入栈 1.若栈为空,则退出循环 2.将栈顶元素弹出,访问弹出的节点 3.若弹出的节点的右孩子不为空则将右孩子入栈 4.若弹出的节点的左孩子不为空则将左孩子入栈 5.返回1 后序遍历非递归: 前序:根->左->右 后序:左->右->根 可以把后序当作:根->右->左,然后再反转一下即可 中序遍历非递归: 根据中序遍历的顺序,对于任一结点,优先访问其左孩子,而左孩子结点又可以看做一根结点,然后继续访问其左孩子结点,直到遇到左孩子结点为空的结点才进行访问,然后按相同的规则访问其右子树。因此其处理过程如下: 对于任一结点P, 1)若其左孩子不为空,则将P入栈并将P的左孩子置为当前的P,然后对当前结点P再进行相同的处理; 2)若其左孩子为空,则取栈顶元素并进行出栈操作,访问该栈顶结点,然后将当前的P置为栈顶结点的右孩子; 3)直到P为NULL并且栈为空则遍历结束。 树结构 /** * Copyright(C) 2019 Hangzhou Differsoft Co., Ltd. All rights reserved. * */ package com.java.offer.tree; /** * @since 2019年2月15日 上午9:23:17 * @author xuchao * *

函数式编程语言

佐手、 提交于 2020-02-09 05:26:30
函数式思想 什么是函数式编程? 百科定义: 函数式编程是种编程方式,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。 个人理解就是我们的编程是以函数作为单元来处理各个业务逻辑,函数既可以当做参数传来传去,也可以作为返回值,可以把函数理解一个值到另一个值得映射关系。 优势特点 代码简洁、开发快速 函数式代码同命令式相比代码量要少很多,一行顶十行,所以实现一些功能也比较简洁。 功能描述:统计文本或网页中单词的频率TF(term frequency),词频在计算网页质量、信息检索中是一个重要概念。 函数式编程思维是对集合统一处理、统一操作,而命令式编程需要取出来每个单词单独处理,单独计数,而函数式只需要传入待处理对象集合、处理规则,我们不需要关注于具体细节,这样编程不仅仅减少了出现bug的概率而且提高了IT人员开发效率,何乐而不为呢。 易于理解,抽象度高 让我们再来看一个在开发中,我们经常遇到场景,例如我们有一个List列表,我们要把user的某个属性提取出来生成一个新的List。 假设你已经了解了函数式语言的语法,你可能会觉得函数式写法很简洁,函数式编程并不需要你关注细节实现,我们在获取用户名作为一个新List时并没有对单独user对象操作,而是是告诉集合对象,我们要做什么

数据结构(三)——二叉树的相关操作

亡梦爱人 提交于 2020-02-09 03:29:59
前言 这里同样不介绍二叉树的相关概念,毕竟数据结构的基础已经讲过很多了,这里不再赘述。至于一些平衡二叉树,完全二叉树,红黑树,B+树等相关结构,这个已经有很多博客介绍了,这里只是介绍一下二叉树的一些基础操作。 定义 这个应该见过多次 /** * autor:liman * createtime:2020/2/6 * comment:二叉树节点的实现 */ public class TreeNode { public String value ; public TreeNode left ; public TreeNode right ; public TreeNode ( String value ) { this . value = value ; } } 遍历的非递归实现 递归的实现非常简单,估计很多人都会,这里就介绍非递归的遍历实现 基本的遍历操作如下:这里示意的输出一下表示遍历操作 /** * 做遍历的操作。 * * @param node */ public static void doTraverse ( TreeNode node ) { System . out . print ( node . value + " " ) ; } 先序遍历 /** * 非递归实现的先序遍历,这里用到了栈的操作 * * @param root */ public static

递归遍历二叉树

时间秒杀一切 提交于 2020-02-09 00:23:27
#二叉树结点 class BinaryTreeNode(object): def __init__(self): self.data='#' self.LeftChild=None self.RightChild=None #二叉树类,创建二叉树和遍历二叉树 class BinaryTree(object): def CreateBinaryTree(self,Root): data=input('->') if data=='#': Root=None else: Root.data=data Root.LeftChild=BinaryTreeNode() self.CreateBinaryTree(Root.LeftChild) Root.RightChild=BinaryTreeNode() self.CreateBinaryTree(Root.RightChild) def PreOrder(self,Root): if Root is not None: self.VisitBinaryTreeNode(Root) self.PreOrder(Root.LeftChild) self.PreOrder(Root.RightChild) def InOrder(self,Root): if Root is not None: self.InOrder(Root

栈与递归

拜拜、爱过 提交于 2020-02-08 23:15:05
递归的经典案例 hanoi塔 思路: 移动n层hanoi塔 ①将n-1层先移动到B塔 ②把A移动到C ③把n-1层从B塔移动到C塔 步骤①: 1)将n-2层先移动到C塔 2)把A移动到B 3)把n-2层从C塔移动到B塔 步骤1): …… private static void hanoi ( int n , String A , String B , String C ) { if ( n == 1 ) System . out . println ( A + "->" + C ) ; else { hanoi ( n - 1 , A , C , B ) ; // 移动层数n-1,源塔A,目标塔B System . out . println ( A + "->" + C ) ; hanoi ( n - 1 , B , A , C ) ; // 移动层数n-1,源塔B,目标塔C } } 递归与非递归的转换 消除递归的原因 1、递归执行需要系统提供隐式栈实现递归,因此效率低 2、递归算法是一次执行完成的,再处理某些问题时不合适 3、有些语言不支持递归(FOR-TRAN) 递归转换成非递归的方法 一类,简单递归问题的转换,对于尾递归和单向递归的算法,可用循环结构的算法替代;另一类,将递归中隐式的栈机制转换成用户控制的栈,利用栈来存储参数。 简单递归问题 求阶乘:n! private

python学习之路4

这一生的挚爱 提交于 2020-02-08 22:51:08
一、字符编码与转码 1.在python2默认编码是ASCII, python3里默认是utf-8 2.unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), so utf-16就是现在最常用的unicode版本, 不过在文件里存的还是utf-8,因为utf8省空间 3.在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string in python3 #-*-coding:gb2312 -*- #这个也可以去掉 __author__ = 'xxx' import sys print(sys.getdefaultencoding()) msg = "姆巴佩" #msg_gb2312 = msg.decode("utf-8").encode("gb2312") msg_gb2312 = msg.encode("gb2312") #默认就是unicode,不用再decode,喜大普奔,如果是py2需先解码成unicode再编码成gb2312 gb2312_to_unicode = msg_gb2312.decode("gb2312") gb2312_to_utf8 = msg_gb2312.decode("gb2312").encode("utf-8")

动态规划专题--------计蒜客--T1208--放苹果

喜欢而已 提交于 2020-02-08 22:19:52
题目链接: https://nanti.jisuanke.com/t/T1208 题目描述 小蒜想知道把 M 个同样的苹果放在 N 个同样的盘子里,允许有的盘子空着不放,共有多少种不同的分法?(用 K 表示)5,1,1 和 1,5,1 是同一种分法。 输入格式 第一行是测试数据的数目 t ( 0 ≤ t ≤ 20 ) 。 以下每行均包含两个整数 M 和 N,以空格分开。1 ≤ M , N ≤ 10。 输出格式 对输入的每组数据 M 和 N,用一行输出相应的 K。 输出时每行末尾的多余空格,不影响答案正确性 样例输入 1 7 3 样例输出 8 这题可以用递归的方法写,也可以用动态规划的思路写。 递归方法: 递归超详解 (个人认为递归的方法比动态规划好理解一些) 动态规划思路: (i,j)代表i个苹果放j个盘子里 要解动态规划的题,最关键的就是找到动态转移方程,要找到动态转移方程就是要找到递推式。这题可以对有无空盘子进行讨论: 1.有空盘子时,(i,j)=(i,j-1),就像5个苹果放3个盘子里,如果有空盘子,这个问题就等价于5个苹果放2个盘子里 2.无空盘子是,(i,j)=(i-1,j),这里因为每个盘子里都有苹果,所以问题每个盘子可以减去一个苹果,就像5个苹果放3个盘子里,因为没有空盘子,所以每个盘子里面至少有一个苹果,即两个苹果放盘子里。 代码: #include

数据结构——二叉树的遍历(c/c++)

给你一囗甜甜゛ 提交于 2020-02-08 19:12:10
递归遍历: 二叉树的三种递归遍历为先序遍历,中序遍历和后续遍历。它们相似之处在于都是对二叉树的递归遍历且对任何一个结点都经过三次,区别在于哪一次对该结点进行访问,由此分为先,中,后序遍历。所以对于任一结点都有:三次经过,一次访问。 先序遍历: void preorder(btNode* p) { if (p != NULL) { visit(p); preorder(p->lc); preorder(p->rc); } } 中序遍历: void inorder(btNode* p) { if (p != NULL) { inorder(p->lc); visit(p); inorder(p->rc); } } 后序遍历: void postorder(btNode* p) { if (p != NULL) { postorder(p->lc); postorder(p->rc); visit(p); } } 对于下图中的树: 先序遍历结果为:ABDECF 根 左 右 中序遍历结果为:DBEAFC 左 根 右 后序遍历结果为:DEBFCA 左 右 根 中序与先(后)序可唯一确定一颗二叉树。 层序遍历: 二叉树的层序遍历的实现思路:建立一个辅助数据结构队列,将二叉树头节点入队,在出队时将其左右孩子挨个入队,每出队一个结点,将其左右孩子入队,直至队列为空。 void level

递归_串的翻转

白昼怎懂夜的黑 提交于 2020-02-08 18:46:06
题目:字符串的翻转 思路:递归 假设翻转"abcde",相当于翻转"bcde"+“a” 以此类推,递归下去 代码: import java . util . Scanner ; public class StringRotate { public static String rotate ( String s ) { if ( s . length ( ) <= 1 ) { return s ; } return rotate ( s . substring ( 1 ) ) + s . charAt ( 0 ) ; //"bcde"+a } public static void main ( String [ ] args ) { Scanner scanner = new Scanner ( System . in ) ; String s = scanner . next ( ) ; System . out . println ( rotate ( s ) ) ; } } 运行结果: 来源: CSDN 作者: 逆蝶~ 链接: https://blog.csdn.net/qq_43361209/article/details/104225955

二分查找算法(JAVA)

笑着哭i 提交于 2020-02-08 17:38:47
1.二分查找又称折半查找,它是一种效率较高的查找方法。 2.二分查找要求:(1)必须采用 顺序存储结构 (2).必须按关键字大小 有序排列 3.原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中值,中值后;将要查找的值和数组的中值进行比较,若小于中值则在中值前 面找,若大于中值则在中值后面找,等于中值时直接返回。然后依次是一个递归过程,将前半部分或者后半部分继续分解为三部分。     其查找的基本思路:首先将给定值K,与表中中间位置元素的关键字比较,若相等,返回该元素的存储位置;若不等,这所需查找的元素只能在中间数据以外的前半部分或后半部分中。然后在缩小的范围中继续进行同样的查找。如此反复直到找到为止。 4.实现:二分查找的实现用递归和循环两种方式 5.代码: 1 package other; 2 3 public class BinarySearch { 4 /* 5 * 循环实现二分查找算法arr 已排好序的数组x 需要查找的数-1 无法查到数据 6 */ 7 public static int binarySearch(int[] arr, int x) { 8 int low = 0; 9 int high = arr.length-1; 10 while(low <= high) { 11 int middle = (low + high)/2