
Java 数据结构
文章平均质量分 75
MarthinMr
这个作者很懒,什么都没留下…
展开
-
java 单向和双向链表的详解
Java 链表的使用浅谈自己学习链表之后的理解:链表是一种重要的数据结构,有单链表和双链表之分单链表(单向链表):由两部分组成 数据域(Data)和结点域(Node),单链表就像是一条打了很多结的绳子,每一个绳结相当于一个结点,每个节结点间都有绳子连接,这样原理的实现是通过Node结点区的头指针head实现的,每个结点都有一个指针,每个节点指针的指向都是指向自身结点的下一个结点,最后一原创 2016-06-29 16:37:44 · 24576 阅读 · 5 评论 -
java 二叉树(十)前九篇二叉树的综合测试
共有三个类:结构体:Object(仅存放数据)树类:Tree测试类:TestObject:package 二叉树;public class Object { public int value;}Tree:package 二叉树;public class Tree { public Node root; //根节点 //public Node left;原创 2016-07-06 19:09:07 · 548 阅读 · 0 评论 -
java 二叉树(十二)二叉树计算表达式
实现原理:把得到的逆波兰式进行逐个压入栈中,如:ab+c*ab+e/- 首先把a当作一个节点压入栈S中,然后继续吧b压入栈S中,当遇到+时,先把b弹出作为+的右孩子,把a 弹出作为+的左孩子。然后把+作为a和b的根节点,这样就形成了一颗树。然后把+压入栈S中,依次重复向S1中压入即可。最后把得到的二叉树进行后序遍历计算,后序遍历的时候每遇到一个操作符就把操作符的左孩子和右孩子进行相应的操作即可原创 2016-07-09 11:39:08 · 2587 阅读 · 0 评论 -
java 二叉树(十一)表达式与逆波兰序列
后缀表达式(逆波兰式):将运算符写在操作数之后。算法实现:1.准备两个空栈:S1,用来存放运算符;S2用来存放操作数和接收S1弹出的 运算符,最后得到的栈S2就是后缀表达式的逆向序列。2.从左至右解析表达式的操作数,运算符,和左右括号。3.当解析出一个操作数时,把操作数压入S2栈顶。4.当解析出运算符时,将该运算符与S1栈顶的运算符进行比较,若当前运算符 的优先级大于栈顶的原创 2016-07-09 11:35:05 · 900 阅读 · 0 评论 -
Java 二叉树(一)普通方式的创建
Java二叉树(一)普通方式的创建二叉树是一种树形结构,一种树形结构,一种重要的数据结构,一种树形结构。它的特点是每个节点至多只有两棵子树(即二叉树中不存在度大于2的节点),并且,二叉树的子树有左右顺序之分,其次序不能任意颠倒。链表创建二叉树链表类创建:创建一个节点类Node,在节点类中创建一个数据区用于存放数据,创建一个左子树指向的引用,创建一个右子树指向的引用。 链表中原创 2016-07-06 10:13:48 · 1217 阅读 · 0 评论 -
java 实现平衡树
package 平衡树;public class Tree { public Node root; //二叉树的:中序遍历 public void inOrder(Node temp){ if(temp!=null){ inOrder(temp.leftChild); System.out.println("--中序--"+temp.data);原创 2016-08-02 19:24:22 · 589 阅读 · 0 评论 -
java 快速排序 插入排序 选择排序
package 未做_快速排序_归并排序_二分查找_等排序;/* * 快速排序 * 使用递归方法 * 把数组拆分为两个子数组加上一个基准元素: * 1.选取最后一个元素作为基准元素,index变量记录最近一个小于基准元素的元素所在的位置, * 初始化为start- 1,发现新的小于基准元素的元素,index加1。 * 从第一个元素到倒数第二个元素,依次与基准元素比较, * 小于基原创 2016-08-02 19:29:46 · 612 阅读 · 0 评论 -
java 折半查找
package 快速排序_归并排序_二分查找_等排序;public class ZheBanChaZhao {//折半查找 public static int count=0; public static int count1=0;//记录找到的值 public static boolean asd=true; public static void main(String[] args)原创 2016-08-06 01:04:57 · 603 阅读 · 0 评论 -
java 希尔排序
package 快速排序_归并排序_二分查找_等排序;/*希尔排序 * 升序 * 不稳定 */public class ShellSort { public static void main(String args[]){ int[] arr = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3 }; int d=arr.length;原创 2016-08-06 13:41:03 · 379 阅读 · 0 评论 -
java 实现汉语拼音排序
Java提供的Collator拼音排序中,发现“怡”字总排在最后解决方案如下: 实现Comparator接口,利用pinyin4j将要比较的字符串转化成相应的拼音字符串,然后再比较。 所需jar包:pinyin4j-2.5.0.jar;下载地址:http://pinyin4j.sourceforge.net/Java代码 import java.util.Arrays; impo原创 2016-08-07 11:51:17 · 5065 阅读 · 0 评论 -
java 基数排序(稳定排序)
package 快速排序_归并排序_二分查找_等排序;/* 基数排序(桶子法)//稳定排序 * 1.首先找到最大的数的位数 * 2.根据最大位数把所有数字的高位补0,然后所有数字的长度相等 * 3.根据最低位个位 0-9开始排序,得到新序列l * 4.再根据新序列l对十位开始排序,直到排序到最高位为止 * 5.感觉类似于hash算法了 * * 数组中的最大数字的位数是多少,需要进原创 2016-08-07 15:30:13 · 1021 阅读 · 0 评论 -
java 归并排序(稳定)
package 快速排序_归并排序_二分查找_等排序;public class GuiBIngSort { public static void main(String args[]){ int[] arr = {-3,10,3,4,-1,2,5,6,7,0,1,8,9}; int[] aaa = new int[arr.length]; //Sort(arr,aaa,0,arr原创 2016-08-07 01:14:02 · 547 阅读 · 0 评论 -
java 环形数组缓冲区
package Server;//环形数组缓冲区 缓冲区所能存放的数据为缓冲区大小的个数 减去1 为实际能存储的大小public class Area_Buffer { private byte[] buf=null; private int start; private int end; public Area_Buffer(int s){//构造函数定义缓冲区的大小 buf =原创 2016-09-04 19:03:01 · 3247 阅读 · 0 评论 -
java 实现红黑树
package 红黑树;public class Red_Black_Tree { public Node root; //二叉树的:中序遍历 int m=0; public void inOrder(Node temp){ if(temp!=null){ inOrder(temp.left); System.out.原创 2016-08-02 19:26:39 · 377 阅读 · 0 评论 -
java 二叉树(七)获取左子树中的最大节点
使用递归算法此时要获取A的左子树中的最大值,首先分析最大值一定在左子树中的最右边,即B,这个最大值B也一定没有右孩子,那么我们只需要把A的右孩子的指向指向C即可,涉及到B的双亲节点和B的左孩子。然后把得到的B节点返回即可。//查找一个节点下所有子孙中的最大值,并且删除这个节点, public Node delFind(Node node){ //传入参数为被删除节原创 2016-07-06 17:24:48 · 2490 阅读 · 1 评论 -
java 二叉树(八)获取右子树中的最小节点
//获取右子树中的最小节点 public Node minRightNode(Node node){//传入参数为被删除节点的右孩子Node node if(node.getLeftChild()==null){ return null; } if(node.getLeftChild().getLeftChild()==null){ if(node.getLeftChil原创 2016-07-06 18:47:20 · 1175 阅读 · 0 评论 -
java 数组与链表的嵌套使用(数组链表--数据结构)
用处:链表数组一般用于在不借用数据库的情况下,对于大量数据的临时存储,来实现快速查找的功能。嵌套实现思想:上一篇中已经讲了链表的创建和操作,借用上一篇中的部分来进行说明。上一篇中的类LinkList 是链表类,类中有对链表的各种操作,要把链表和数组联系起来,就要定义一个链表类型的数组:LinkList arr [ ] ,我们要把数组中的每个元素都映射为一个链表,通过计算可以得出: 例如原创 2016-06-29 19:18:05 · 5748 阅读 · 2 评论 -
Java 堆排序(大顶堆、小顶堆)
引用:http://lib.youkuaiyun.com/article/datastructure/8973堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序的平均时间复杂度为Ο(nlogn) 。算法步骤:1. 创建一个堆H[0..n-1]2. 把堆首(最大原创 2016-07-23 14:10:21 · 18862 阅读 · 6 评论 -
Java 键树---字典树(小词典)的实现
键树的基本概念键树又称数字查找树(Digital Search Tree)。 它是一棵度大于等于2的树,树中的每个结点中不是包含一个或几个关键字,而是只含有组成关键字的符号。 例如,若关键字是数值,则结点中只包含一个数位;若关键字是单词,则结点中只包含一个字母字符。 这种树会给某种类型关键字的表的查找带来方便。 如下图所示为一棵键树: 从根到叶子结点路径中结原创 2016-07-23 14:45:43 · 1803 阅读 · 3 评论 -
java 用栈的原理(穷举)实现迷宫游戏
迷宫分析:在一个封闭的空间内,用’0’表示可走,’1’表示墙;有一个起点和一个终点,需要找到从起点到终点的通路,还要保证在寻路的过程中不会出现来回走的情况。从起点出发,我们用0,1,2,3来表示上下左右,也就是寻路的方向;每走一步之后都按照0,1,2,3的方向进行试探可否走,如果能走,把能走的坐标和来时的方向进行压栈,栈里都是走过的路线,如果0不通走1,1不通走2,2不通走3,都不通退一格,继续按原创 2016-07-04 10:45:42 · 1777 阅读 · 0 评论 -
java 二叉树(十三) 哈夫曼树和哈夫曼编码
一般可以按下面步骤构建:1,将所有左,右子树都为空的作为根节点。2,在森林中选出两棵根节点的权值最小的树作为一棵新树的左,右子树,且置新树的附加根节点的权值为其左,右子树上根节点的权值之和。注意,左子树的权值应小于右子树的权值。3,从森林中删除这两棵树,同时把新树加入到森林中。4,重复2,3步骤,直到森林中只有一棵树为止,此树便是哈夫曼树。下面是构建哈夫曼树的图解过程:原创 2016-07-14 22:54:58 · 884 阅读 · 0 评论 -
java KMP 字符串匹配算法
KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。下面讲一下我的个人思路:首先是next()函数的实现,然后求出next【】数组。假如我们现在需要求的是: 字符串B: “ABCDABD”在字符串A:“ABCDAB-BBC-ABCDAB-ABCDABCDABDE” 中出现的原创 2016-07-04 17:35:52 · 1146 阅读 · 0 评论 -
java 实现跳跃表
跳跃链表是一种随机化数据结构,基于并联的链表,其效率可比拟于二叉查找树(对于大多数操作需要O(log n)平均时间),并且对并发算法友好。基本上,跳跃列表是对有序的链表增加上附加的前进链接,增加是以随机化的方式进行的,所以在列表中的查找可以快速的跳过部分列表(因此得名)。所有操作都以对数随机化的时间进行。实现原理:跳跃表的结构是:假如底层有10个节点, 那么底层的上一层理论上就有5个节原创 2016-07-15 14:08:41 · 3875 阅读 · 1 评论 -
java 二叉树(二)递归方式创建二叉树
链表中的数据区,使用结构体存储:class Object{ public int value; } 树类创建:创建一个树类Tree,在类中创建一个根节点。链表类Node:public class Node{ public Object data; public Node leftNode; public Node rightNode; public Node(O原创 2016-07-06 10:20:58 · 938 阅读 · 0 评论 -
java 二叉树(三)递归遍历二叉树
在二叉树的一些应用中,常常要求在树中查找具有某些特征的节点,或者对树中进行全部的节点逐一进行某种处理。这就提出了一个遍历二叉树的问题,即如何按照某条路径依次寻访树中的每个节点,使得每个节点均被访问一次,而且是仅被访问一次。根据二叉树的特点可知,二叉树有三个基本元素组成:根节点,左子树,右子树。因此若能依次遍历这三部分,便是遍历了整个二叉树。 二叉树的遍历方法和操作:原创 2016-07-06 10:42:52 · 659 阅读 · 0 评论 -
java 二叉树(四)求二叉树的深度和节点总数
1.判断根节点是否为空2.递归获取左子树的深度3.递归获取右子树的深度public int hight(Node node){ if(node==null){ return 0; }else{ int i=hight(node.getLeftChild()); int j=hight(node.getRightChild()); return (i<j)原创 2016-07-06 16:44:03 · 3624 阅读 · 0 评论 -
java 二叉树(六)查找二叉树一个节点的双亲节点
原理:递归查找,使用查找节点的函数找到在树中的值,然后当当前节点的左孩子的指向或右孩子的指向为查找到的节点时,返回当前节点即可比如: node.getLeftChild()==findNode()那么其findNode()的父节点即为:node.public Node parent(Object obj){ Node temp=parent(root, obj); return原创 2016-07-06 17:22:34 · 7570 阅读 · 0 评论 -
java 二叉树(五)查找二叉树中的节点
原理:递归遍历查找public Node findNode(Object obj){ Node node = new Node(obj); if(root==null){ System.out.println("树中没有你要查找的值!"); return null; }else{ Node temp=findNode(root,node); return原创 2016-07-06 17:20:24 · 1546 阅读 · 0 评论 -
java 二叉树(九)删除二叉树中的某一个节点
我们首先看一下删除一个不是根节点的节点牵涉到几个节点:删除E后现在需要删掉E需要 E的父节点B ,以A为根节点的最大节点(上一篇讲过获取B节点)A,E的左孩子F,E的右孩子 思路如下:首先考虑删除的是不是根节点,在考虑删除的是树中的某一个节点。当删除的是根节点的时候,仅需要把其左子树中的最大值节点Node放到根节点,然后把Node的左孩子原创 2016-07-06 19:00:02 · 5149 阅读 · 0 评论 -
如何判断一个单链表是否有环?
三类情况:(1)(2)(3)1、遇到这个问题,首先想到的是遍历链表,寻找是否有相同地址,借此判断链表中是否有环。listnode_ptr current =head->next;while(current){ if(current==head) { printf("有环!\n"); return 0; } else { current=curr...转载 2018-03-06 14:00:05 · 889 阅读 · 0 评论