数据结构

数据结构二叉树基础以及四种遍历方式(递归和迭代)

做~自己de王妃 提交于 2020-03-02 07:27:18
数据结构二叉树基础 文章目录 数据结构二叉树基础 一、二叉树的基本概念 二、特殊的二叉树 三、二叉树的4种遍历方式 一、二叉树的基本概念 节点的度 :一个节点含有的子树的个数称为该节点的度; **树的度:**一棵树中,最大的节点的度称为树的度; 叶子节点或终端节点 :度为0的节点称为叶节点; 双亲节点或父节点 :若一个节点含有子节点,则这个节点称为其子节点的父节点; 孩子节点或子节点 :一个节点含有的子树的根节点称为该节点的子节点; **根结点:**一棵树中,没有双亲结点的结点; **树的高度或深度:**树中节点的最大层次 一棵二叉树 是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉 树组成。 二叉树的特点: 每个结点最多有两棵子树,即二叉树不存在度大于 2 的结点。 二叉树的子树有左右之分,其子树的次序不能颠倒 二、特殊的二叉树 1, 完全二叉树: 完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n 个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全 二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。 2, 满二叉树: 一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果 一个二叉树的层数为K,且结点总数是(2^k)

数据结构与算法之买股票的最佳时机

一个人想着一个人 提交于 2020-03-02 04:18:22
买股票的最佳时机 题目 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。 注意你不能在买入股票前卖出股票。 示例 1: 输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。 示例 2: 输入: [7,6,4,3,1] 输出: 0 解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。 链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock。 思路 利用两个for循环依次求出后面数与其前面数的差值,输出这些差值中的最大值即为最大利润。 源代码(c++) class Solution { public : int maxProfit ( vector < int > & prices ) { int len = prices . size ( ) ; int max = 0 ; int res = 0 ; for ( int i = 0 ; i < len - 1 ; i ++ ) { for ( int

数据结构与算法(作业五)

孤街浪徒 提交于 2020-03-02 04:02:11
合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。 运算代码如下 class Solution { public void merge ( int [ ] nums1 , int m , int [ ] nums2 , int n ) { int len = m + n ; for ( int i = len - 1 ; i >= 0 ; i -- ) { if ( ( m > 0 && n > 0 && nums1 [ m - 1 ] > nums2 [ n - 1 ] ) || n == 0 ) { nums1 [ i ] = nums1 [ -- m ] ; } else { nums1 [ i ] = nums2 [ -- n ] ; } } } } 这道题从两个数组右侧开始比较, 即可按从大到小开始合并数组, 即可利用数组1右侧的空间, 不需要额外存储空间。 效率挺高! 来源: CSDN 作者: 想扣篮的Phineas 链接: https://blog.csdn.net/BryceFei/article/details/104590947

常用数据结构以及数据结构的排序算法

耗尽温柔 提交于 2020-03-02 02:39:24
数组 (Array)   在程序设计中,为了处理方便, 把具有相同类型的若干 变量 按有序的形式组织起来。这些按序排列的同类数据元素的集合称为 数组 。在C语言中, 数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、 指针数组 、结构数组等各种类别。 栈 (Stack)   是只能在某一端插入和删除的特殊 线性表 。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。 队列 (Queue)   一种特殊的 线性表 ,它只允许在表的 前端 (front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。 链表 (Linked List)   是一种物理存储单元上非连续、非顺序的存储结构,数据元素的 逻辑顺序 是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时 动态 生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 树 (Tree)   是包含n(n>0)个结点的有穷集合K,且在K中定义了一个关系N,N满足 以下条件:  

基本数据结构之Sort

别等时光非礼了梦想. 提交于 2020-03-02 01:26:45
问题描述: BubbleSort InsertionSort ShellSort MergeSort HeapSort QuickSort 问题分析: 时间复杂度? 空间复杂度? 代码实现: public class BubbleSort { public static <AnyType extends Comparable<? super AnyType>> void bubblesort(AnyType[] a){ boolean done = false; int size = a.length; while(!done){ done = true; for(int i = 0; i < size - 1; i++){ if(a[i].compareTo(a[i+1]) > 0){ done = false; AnyType tmp = a[i+1]; a[i+1] = a[i]; a[i] = tmp; } } size--; } } } class InsertionSort { public static <AnyType extends Comparable<? super AnyType>> void insertionSort(AnyType[] a) { for (int p = 1; p < a.length; p++) { AnyType tmp = a[p

设计模式(行为型模式)——访问者模式(Visitor)

烂漫一生 提交于 2020-03-02 00:05:19
访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化。访问者模式适用于数据结构相对稳定算法又易变化的系统。因为访问者模式使得算法操作增加变得容易。若系统数据结构对象易于变化,经常有新的数据对象增加进来,则不适合使用访问者模式。访问者模式的优点是增加操作很容易,因为增加操作意味着增加新的访问者。访问者模式将有关行为集中到一个访问者对象中,其改变不影响系统数据结构。其缺点就是增加新的数据结构很困难。—— From 百科 简单来说,访问者模式就是一种分离对象数据结构与行为的方法,通过这种分离,可达到为一个被访问者动态添加新的操作而无需做其它的修改的效果。简单关系图: 来看看原码:一个Visitor类,存放要访问的对象, public interface Visitor { public void visit(Subject sub); } public class MyVisitor implements Visitor { @Override public void visit(Subject sub) { System.out.println("visit the subject:"+sub.getSubject()); } } Subject类,accept方法,接受将要访问它的对象,getSubject()获取将要被访问的属性, public

《数据结构与算法》—— O(3N)=O(N) ?

家住魔仙堡 提交于 2020-03-01 22:52:24
上帝的磨盘转动很慢,但是却磨得很细。 ——毛姆 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。 https://github.com/midou-tech/articles 数据结构的基本概念 数据结构 相互之间存在一种或多种特定关系的数据元素的集合,我总结一下就是描述数据关系的一种载体。 数据结构包括逻辑结构和存储结构两个层次的描述。 逻辑结构 描述数据逻辑关系的一种方式,与数据的存储无关。逻辑结构中数据元素之间的关系主要分为四种:集合结构、线性结构、树结构、图结构。所有的数据结构在逻辑上都可以用这四种中的一种。 存储结构 数据和数据元素逻辑关系的存储对象,也被称为物理结构。通常逻辑结构包含两种,链式存储和顺序存储。 顺序存储 数据元素存储在一块连续的内存空间上,例如数组,就是一块连续的空间。 链式存储 数据存储不一定在一块连续的内存空间上,例如单链表。 数据类型 是一组值的集合和定义在这个集合上的操作的总称。 抽象数据类型 由用户定义的表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称,具体包括三部分,数据对象、数据对象上关系的集合以及对数据对象基本操作的集合。 抽象数据类型有自己的定义格式: ADT 抽象数据对象名 { 数据对象:(数据对象的定义) 数据关系:(数据关系的定义) 基本操作:(基本操作的定义) } 算法与数据结构 算法

《数据结构与算法》—— O(3N)≈O(N) O(3N)=O(N)?

自作多情 提交于 2020-03-01 22:25:41
上帝的磨盘转动很慢,但是却磨得很细。 ——毛姆 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。 https://github.com/midou-tech/articles 数据结构的基本概念 数据结构 相互之间存在一种或多种特定关系的数据元素的集合,我总结一下就是描述数据关系的一种载体。 数据结构包括逻辑结构和存储结构两个层次的描述。 逻辑结构 描述数据逻辑关系的一种方式,与数据的存储无关。逻辑结构中数据元素之间的关系主要分为四种:集合结构、线性结构、树结构、图结构。所有的数据结构在逻辑上都可以用这四种中的一种。 存储结构 数据和数据元素逻辑关系的存储对象,也被称为物理结构。通常逻辑结构包含两种,链式存储和顺序存储。 顺序存储 数据元素存储在一块连续的内存空间上,例如数组,就是一块连续的空间。 链式存储 数据存储不一定在一块连续的内存空间上,例如单链表。 数据类型 是一组值的集合和定义在这个集合上的操作的总称。 抽象数据类型 由用户定义的表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称,具体包括三部分,数据对象、数据对象上关系的集合以及对数据对象基本操作的集合。 抽象数据类型有自己的定义格式: 1ADT 抽象数据对象名 {2 数据对象:(数据对象的定义)3 数据关系:(数据关系的定义)4 基本操作:(基本操作的定义)5} 算法与数据结构 算法

《数据结构与算法》—— O(3N)=O(N) ?

邮差的信 提交于 2020-03-01 21:44:26
上帝的磨盘转动很慢,但是却磨得很细。 ——毛姆 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。 https://github.com/midou-tech/articles 数据结构的基本概念 数据结构 相互之间存在一种或多种特定关系的数据元素的集合,我总结一下就是描述数据关系的一种载体。 数据结构包括逻辑结构和存储结构两个层次的描述。 逻辑结构 描述数据逻辑关系的一种方式,与数据的存储无关。逻辑结构中数据元素之间的关系主要分为四种:集合结构、线性结构、树结构、图结构。所有的数据结构在逻辑上都可以用这四种中的一种。 存储结构 数据和数据元素逻辑关系的存储对象,也被称为物理结构。通常逻辑结构包含两种,链式存储和顺序存储。 顺序存储 数据元素存储在一块连续的内存空间上,例如数组,就是一块连续的空间。 链式存储 数据存储不一定在一块连续的内存空间上,例如单链表。 数据类型 是一组值的集合和定义在这个集合上的操作的总称。 抽象数据类型 由用户定义的表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称,具体包括三部分,数据对象、数据对象上关系的集合以及对数据对象基本操作的集合。 抽象数据类型有自己的定义格式: 1ADT 抽象数据对象名 {2 数据对象:(数据对象的定义)3 数据关系:(数据关系的定义)4 基本操作:(基本操作的定义)5} 算法与数据结构 算法

Python----数据结构----链表----单向链表

耗尽温柔 提交于 2020-03-01 19:37:56
Python学习之路,点击有全套Python笔记 什么是链表 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是在每一个节点(数据存储单元)里存放下一个节点的位置信息(即地址)。 单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。 表元素域elem用来存放具体的数据。 链接域next用来存放下一个节点的位置(python中的标识) 变量p指向链表的头节点(首节点)的位置,从p出发能找到表中的任意节点。 实现: 步骤: is_empty() 链表是否为空 length() 链表长度 travel() 遍历整个链表 add(item) 链表头部添加元素 append(item) 链表尾部添加元素 insert(pos, item) 指定位置添加元素 remove(item) 删除节点 search(item) 查找节点是否存在 # 单链表 class Node : """节点""" def __init__ ( self , elem ) : self . elem = elem self . next = None node = Node ( 100 ) class SingleLinkList