数据结构
通凡
这个作者很懒,什么都没留下…
展开
-
二叉树--反转
1、求二叉树的镜像 最为容易理解的递归代码public TreeNode invertTree(TreeNode root) { if (root == null) { return null; } TreeNode left = root.left, right = root.right; if (root.原创 2016-05-24 11:27:09 · 558 阅读 · 0 评论 -
shell排序
希尔排序public Class Shell{ int i, j, temp; int increasement = a.length; do{ increasement = increasement /3 + 1; for(i = increasement; i < a.length; i++){原创 2016-05-05 16:44:52 · 440 阅读 · 0 评论 -
归并排序
归并排序递归public static void sort1(int[] array, int low, int high) { int mid = (low + high) / 2; if (low < high) { sort(array, low, mid); sort(array, mid + 1, high);原创 2016-05-05 19:31:54 · 374 阅读 · 0 评论 -
单链表逆序(三种方式)
三种方式实现单链表的逆序,分别是头结点插入,对称交换和利用堆栈来实现。三种方式分别是出于空间和时间的考虑来实现的,详见注释。public class LinkedList { class Node { private Node next; private Object data; public Node() { super(原创 2016-05-20 19:09:25 · 8331 阅读 · 0 评论 -
链表删除节点(O(1))
题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};函数的声明如下:void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted); 分析:这原创 2016-05-20 19:46:49 · 961 阅读 · 1 评论 -
常见的链表操作
1. 单链表的逆序包括逆序输出链表,三种方式,第一种是操作用栈的方式,将链表装入栈中,然后新建链表进行输出;第二种是头结点插入,没来一个节点,就插入头结点之后;第三种是对称交换,将链表以中心节点为中心,进行对称交换。2. 合并有序链表有序链表合并是有两种方式,一种是新建一个全新的链表,对比两个有序的链表的对应节点的大小,一次添加到新建的链表中,如果两个链表不等长,那么最后将长的那一个追加到新建链表的原创 2016-05-23 10:50:23 · 1207 阅读 · 0 评论 -
树的总结
树是数据结构中最为常见的数据结构之一,最为常见的就是二叉树(Binary Tree),下面我们对树进行一次总结。二叉树平衡二叉树线索二叉树二叉排序树二叉搜索树红黑树哈弗曼树B树treap树trie树原创 2016-05-23 11:20:39 · 570 阅读 · 0 评论 -
二叉树--后缀trie树
Suffix Trie:又称后缀Trie或后缀树。它与Trie树的最大不同在于,后缀Trie的字符串集合是由指定字符串的后缀子串构成的。比如、完整字符串"minimize"的后缀子串组成的集合S分别如下: s1=minimize s2=inimize s3=nimize s4=imize s转载 2016-06-03 20:32:59 · 4409 阅读 · 1 评论 -
二叉树--trie树
闲来无事,写写博客,总结一下trie树;算法原理首先,让我们对trie树来一个比较直观的认识,下面的这个例子,大家应该都能够理解。 下面我们有and,as,at,cn,com这些关键词,那么如何构建trie树呢?在上面这个棵树中,树的根节点没有存储任何的数据,就只是root,而将这些单词按照相同前缀,分支节点的顺序进行存储,这样有一个好处就是,相同前缀的单词的前缀我只需要存储一次就可以了,遍历树原创 2016-06-03 20:26:49 · 5028 阅读 · 0 评论 -
快排实现
递归实现public Class QuickSort{ public static void qSort(int[] array, int low, int high) { if (array == null) { return; } if (low < high) { int mid = pat原创 2016-04-26 17:10:19 · 832 阅读 · 0 评论 -
二叉树--红黑树
红黑树定义红黑树,顾名思义,就是树的节点只有红色和黑色两种状态,通过这两种状态的标识和规定颜色的使用,来使树达到相对平衡。为什么说相对平衡?因为在红黑树中,所有的条件限制只能保证,所有路径中最长的路径不能使最短路径的2倍。只能保证相对平衡。有人讨论:红黑树是不是一棵平衡二叉树?因为红黑树不满足严格的平衡二叉树的定义,从严格意义上来讲,红黑树并不是平衡二叉树;但是,红黑树在建立的时候,也是有平衡调整的原创 2016-05-27 19:20:06 · 3929 阅读 · 0 评论 -
二叉树--最小路径
最小路径二叉树中的最小路径指的是,二叉树中根节点到达叶子节点的路径中,距离最短的一个。//recursivelypublic int minDepth1(TreeNode root) { if (root == null) { return 0; } else if (root.left != null && root.right != null) {原创 2016-05-24 15:36:02 · 5102 阅读 · 0 评论 -
二叉树--深度
在二叉树中,最为常见就是求解一棵树的深度,最为常见的方式分为递归求解和非递归求解,具体代码如下。 树形结构public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; }原创 2016-05-23 16:02:18 · 732 阅读 · 1 评论 -
二叉树--最近公共父节点
给定二叉树中的任意两点,求解该两点的最近公共父节点。程序大致分为递归和非递归两种方式,下面我们先来认识非递归的方式。非递归程序总体的思路:用一种常见高效的数据结构来记录下二叉树中的结构关系,由于是找父节点,所以要用子节点来查找父节点,我们这里用到的是HashMap来进行树形关系的存储。接下来就是先列出一个要求节点的所有父节点,然后比较另一个要求节点的父节点在不在上面的列中,第一个出现的节点,就是我们原创 2016-05-24 17:54:34 · 8119 阅读 · 0 评论 -
二叉树--根据遍历构造二叉树
二叉树中的三种遍历方式,是我们最为熟知的,通过先序遍历+中序遍历或者是中序遍历+后序遍历都可以唯一确定一棵二叉树;但是注意,先序遍历+后序遍历不能确定一棵二叉树,但是如果一棵二叉树中只有度为0和度为2的节点,那么这种遍历方式也是可以确定一棵确定的二叉树的。先序+中序–>构造二叉树下面我们分别来看一下,根据先序+中序遍历的顺序,如何恢复一棵二叉树,代码如下://首先采用递归的方式public Tre原创 2016-05-25 11:02:11 · 4930 阅读 · 2 评论 -
二叉树--路径
二叉树中,从根节点到叶节点的每一条连接,我们称之为路径,最短路径和最长路径在之前的博客中,我们已经完成了对他们的讨论,现在我们讨论一下,输出一棵二叉树中全部的路径信息。代码如下所示:public class Operation{ List<String> result = new LinkedList<String>();//存储最后的结果 public List<String> b原创 2016-05-26 10:05:11 · 3490 阅读 · 3 评论 -
二叉树--判断平衡二叉树
判断一棵树是不是平衡二叉树,平衡二叉树的定义就是,左右子树的差的绝对值不超过1,其实也就是求解出每个节点的左右子树的深度差。代码如下:public boolean isBalanced(TreeNode root) { if (root == null) return true; if(!isBalanced(root.left)) return false; if (!is原创 2016-05-26 15:37:56 · 653 阅读 · 0 评论 -
二叉树--二叉搜索树
一直对AVL这个英文缩写比较困惑,原来一直以为是平衡二叉树的首字母缩写,但是又想不明白,哈!前段时间才明白原来是种这课树的三个人的名字的首字母的,哎,生活处处有惊喜,无知不可怕,现在我也知道了。废话不多说,下面我们说说,树形结构中的那些平衡二叉树。二叉排序树树的遍历顺序有3种,二叉排序树,顾名思义,就是一颗有序的二叉树,是一种按照中序遍历树中节点,而输出有序队列的一种树形结构,一种特殊的树形结构。定原创 2016-05-27 11:23:13 · 4259 阅读 · 1 评论 -
二叉树--二叉平衡树
二叉平衡树是二叉树中最为最要的概念之一,也是在语言库或者项目中应用比较广泛的一种特殊的树形结构。二叉平衡树AVL树是高度平衡的而二叉树。它的特点是:AVL树中任何节点的两个子树的高度最大差别为1。 通常AVL树是在二叉搜索树上,经过局部调整而建立的,因此,它还是一棵排序树。上面的两张图片,左边的是AVL树,它的任何节点的两个子树的高度差别都<=1;而右边的不是AVL树,因为7的两颗子树的高度相差为2原创 2016-05-27 14:24:57 · 5018 阅读 · 0 评论 -
二叉树--遍历
遍历分为非递归和递归两种形式,递归的遍历很简单,本文主要针对非递归算法进行说明,详细代码如下:static void visit(TreeNode root) { System.out.println(root.key + "----------->" + root.value);}//先序遍历static void preOrder(TreeNode root) {原创 2016-05-23 19:52:38 · 735 阅读 · 0 评论