
数据结构与算法
java为描述语言,介绍计算机编程中使用的数据结构和算法,强调问题及其分析,而非理论阐述
阿飞Sirx
追求自我,超越自我
展开
-
长度n数组中查找最大元素
//扫描整个数组并返回最大的元素void FindLargestInArray(int n,int[] a){ int large = a[0]; for(int i = 0;i<=n-1;i++){ if(int i = 1;i<=n-1;i++){ if(a[i] > large){ large = a[i]; } } System.out.println("Largest"+large); }}voi原创 2021-05-17 21:17:16 · 307 阅读 · 0 评论 -
给定长度为n的数组,判断数组中是否存在重复的元素
1.穷尽搜索void checkDuplicateBruteForce(int[] a,int n){ for(int i = 0;i<n;i++){ for(int j = i +1;j<n;j++){ if(a[i] == a[j]){ System.out.println("Dubplicates exist"+a[i]); } } } System.out.println("No duplicates in given原创 2021-05-13 20:26:31 · 843 阅读 · 0 评论 -
查找的类型
1.无序线性查找假设给定一个数组,其元素的排列顺序是未知的,数组中的元素无序,如果要查找某个元素,必须通过扫描整个数组才能实现int unSortedLineSearch(int[] a,int n,int data){ for(int i = 0;i<n;i++){ if(a[i] == data){ return i; } } return -1;}2.排序/有序线性查找如果数组的元素已经排序,则许多情况下都不需要扫描整个数组来判断元素是否在给定原创 2021-05-12 21:11:42 · 499 阅读 · 0 评论 -
快速排序
quickSort(int[] a,int low,int high){ int pivot; if(high>low){ pivot = Partition(a,low,high); quickSort(a,low,pivot-1); quickSort(a,pivot+1,high); }}int partition(int[] a,int low,int high){ int left,right,pivot_item=a[low]; right原创 2021-05-11 20:33:53 · 76 阅读 · 0 评论 -
归并排序
void mergeSSort(int[] a,int[] temp,int left,int right){ int mid; if(right > left){ mid = (right+left)/2; mergeSort(a,temp,left,mid); mergeSort(a.temp,mid+1,right); Merge(a,temp,left,mid+1,right); }}void merge(int[] a,int[] temp,原创 2021-05-10 21:20:48 · 82 阅读 · 0 评论 -
希尔排序
void shellSort(int a[],int array_size){ int h = 3*(array_size/9)+1; for(;h>0;h/3){ for(int i = h+1;i<= array_size;i++){ int v = a[i]; int j = i; while(j>h&&a[j-h]>v){ a[j] = a[j-h]; j -= h;原创 2021-05-09 21:05:45 · 65 阅读 · 0 评论 -
插入排序java
void insertionSort(int[] a){ for(int i = 2;i<a.length;i++){ int v = a[i]; int j = i; while(a[j-1]>a[j]){ a[j] = a[j-1]; j--; } a[j]=v; }}原创 2021-05-07 20:49:28 · 74 阅读 · 0 评论 -
选择排序java
void selectionSort(int a[],int n){ for(int i = 0;i< n;i++){ min = i; for(int j = i+1;j< n;j++){ if(a[j]<a[min]){ min = j; } } int temp = a[min] a[min] = a[i]; a[i] = temp; }}原创 2021-05-06 21:28:58 · 74 阅读 · 0 评论 -
冒泡排序java
void bubbleSort(int[] a,int n){ int swapped = 1; for(int pass = n-1;pass >= 0 & swapped == 1; pass --){ swapped = 0; for(int i = 0;i< pass -1;i++){ if(a[i] > a[i+1]){ int temp = a[i]; a[i] = a[i+1]; a[原创 2021-05-06 21:13:38 · 63 阅读 · 0 评论 -
Prim
void Prims(Graph g,int s){ Heap pq = new Heap(); int v,w; pq.enQueue(s); Distance[s]=0; while(!pq.isEmpty()){ v = pq.deleteMin(); for all adjacent vertices w of v{ Compute new distance d = Distance[v] + weight[v][w]; if(Distan原创 2021-04-28 20:35:38 · 80 阅读 · 0 评论 -
有权图最短路径JAVA
void dijkstra(Graph g,int s){ Heap pq = new Heap(); int v,w; pq.enQueue(s); for(int i = 0;i<G.vertexCount;i++){ Distance[i] = -1; } Distance[s] = 0; while(!pq.isEmpty()){ int v = pq.deleteMin(); for(int j =0;j< G.vertexCount原创 2021-04-27 20:57:26 · 156 阅读 · 0 评论 -
无权图的最短路径JAVA
void unWeightedShortestPath(Graph G,int s){ LLQueue q = new LLQueue(); int v,w; q.enQueue(s); for(int i = 0;i<G.vertexCount;i++){ Distance[i] = -1; } Distance[s] = 0; while(!q.isEmpty()){ v = q.deQueue(); for(int j = 0;j< G.原创 2021-04-26 21:02:27 · 316 阅读 · 0 评论 -
图的bfs遍历
class vertex{ public char label; public boolean visited; public Vertex(char lab){ label.= lab; visited = false; }}class graph{ private final int maxVertices = 20; private Vertex vertexList[]; private int adjMatrix[][]; private in原创 2021-04-22 22:03:23 · 110 阅读 · 0 评论 -
DFS搜索
class Vertex{ public char label; public boolean visited; public Vertex(char lab){ this.label = lab; visited = false; }}class Graph{ private final int maxVertices = 20; private Vertex vertexList[]; private int adjMatrix[][]; priva原创 2021-04-21 21:54:42 · 84 阅读 · 0 评论 -
图的邻接表表示方式
public class Graph{ private ArrayList<Integer> vertices; private ListNode[] edges; private int vertexCount = 0; public Graph(int vertexCount){ this.vertexCount = vertexCount; vertices = new ArrayList<>(); edges = new ListNo原创 2021-04-20 20:45:09 · 133 阅读 · 0 评论 -
无向图的代码表示java
public class Graph{ //邻接矩阵 private boolean adjMatrix[][]; //维度 private int vertexCount; //初始化 public Graph(int vertexCount){ this.vertxtCount = vertexCount; adjMatrix = new int[vertexCount][vertexCount]; } //加元素 public void addEdg原创 2021-04-19 21:16:42 · 249 阅读 · 0 评论 -
删除最小堆中的第i元素
int delete(Heap h,int i){ int key; if(i <= -1 || i > this.count){ System.out.println("Wrong position!"); } key = h.array[i]; h.array[i] = h.array[this.count -1]; h.count--; h.percolateDown(i); return key;}原创 2021-04-18 20:30:00 · 223 阅读 · 0 评论 -
数组建堆
public void percolateDown(int i){ int l,r,max,temp; l = leftChild(i); r = rightChild(i); if(l != -1 && this.array[l] > this.array[i]){ max = l; }else{ max = i; } if( r != -1 && this.array[r] > this.array[max]){原创 2021-04-17 21:45:10 · 193 阅读 · 0 评论 -
堆元素的插入以及堆晴空
1.堆的大小+12.将新元素放在堆的尾部3.从下至上堆化这个元素int insert(int data){ int i; if(this.count == this.capacity){ resizeHeap(); } this.count++; i = this.count -1; while(i >= 0 && data > this.array[(i-1)/2]){ this.array[i] = this.array[(i-1原创 2021-04-17 20:51:09 · 154 阅读 · 0 评论 -
堆化操作以及maxHeap最大堆删除元素(JAVA)
堆的一个重要性质是,如果一个元素不满足堆的性质,那么从这个元素开始,到根节点的所有元素都存在这个问题,如果堆化该元素,从这个元素到根节点的所有元素也都满足堆的性质public void precolateDown(int i){ if(i<= -1 || i > this.count){//this.count为堆中具有的元素数 return; } int l = 0; int r = 0; int max = 0; int temp = 0; l = le原创 2021-04-15 21:06:37 · 637 阅读 · 0 评论 -
二叉堆的定义
以最大堆为例public class heap{ //因为堆在形式上是完全二叉树,所以用数组表示不会浪费任何空间 public int[] array; //堆中元素的个数 public int count; //堆的大小 public int capacity; //最大堆或者最小堆 public int heap_type; public heap(int capacity,int heap_type){ this.heap_type = heap_t原创 2021-04-14 21:03:31 · 156 阅读 · 0 评论 -
给定二叉树,连接同一层的邻近节点,假设有指向下一节点指针next
public void linkLevelNodes(BinaryTreeNode root){ Queue q = new Queue(); BinaryTreeNode prev; BinaryTreeNode temp; int currentLevelNodeCount = 0; int nextLevelNodeCount = 0; if(root == null){ return; } q.enQueue(root); currentLevelNode原创 2021-04-13 21:45:20 · 136 阅读 · 0 评论 -
给定BST和数值区间A-B,删除掉非区间内元素(剪枝)
BinarySearchTreeNode pruneBST(BinarySearchTreeNode root,int a,int b){ if(root == null){ return null; } root.setLeft(pruneBST(root.getLeft())); root.setRight(pruneBST(root.getRight())); if(a<=root.getData() && root.getData() <= b原创 2021-04-13 21:24:33 · 104 阅读 · 0 评论 -
删除二叉树的所有叶子结点
BinaryTreeNode removeleaf(BinaryTreeNode root){ if(root == null){ return null; } if(root.getLeft() == null && root.getRight() == null){ return null; }else{ root.setLeft(root.getLeft()); root.setRight(root.getRight()); }原创 2021-04-12 20:59:56 · 1955 阅读 · 0 评论 -
删除二叉树的所有半结点
半结点就是只有一个孩子的结点使用后序遍历,首先处理左孩子,然后处理右孩子,最后是结点本身,因此算法自底向上,从叶子结点到根节点来形成一棵新树,当处理到当前结点,左右子树已经处理完毕BinaryTreeNode removeHalf(BinaryTreeNode root){ if(root == null){ return null; } root.setLeft(removeHalf(root.getLeft())); root.setRight(removeHalf(root原创 2021-04-12 20:48:20 · 87 阅读 · 0 评论 -
判断二叉搜索树是否为AVL树
int isAVL(BinarySearchTreeNode root){ int left = 0; int right = 0; if(root == null){ return 0; } left = isAVL(root.getLeft()); if(left == -1){ return left; } right = isAVL(root.getRight()); if(right == -1){ return right; }原创 2021-04-12 20:09:36 · 571 阅读 · 0 评论 -
AVL树的插入操作
AVLTreeNode insert(AVLTreeNode root,AVLTreeNode parent,int data){ if(root == null){ root = new AVLTreeNode(); root.setData(data); root.setLeft(null); root.setRight(null); root.setHeight(0); } else if(data < root.getData()){原创 2021-04-11 21:22:45 · 267 阅读 · 0 评论 -
AVL树的左左旋转和右右旋转
LLAVLTreeNode singleRotateLeft(AVLTreeNode X){ AVLTreeNode W = X.getLeft(); X.setLeft(W.getRight()); W.serRight(X); X.setHeight(Math.max(Height(X.getLeft()),Height(X.getRight()))+1); W.setHeight(Math.max(Height(W.getLeft()),Height(W.getRight()))原创 2021-04-10 22:11:06 · 233 阅读 · 0 评论 -
AVL树的性质以及定义(JAVA实现)
1.AVL树是一颗二叉搜索树,具有二叉搜索树的性质2.对任意结点X,其左子树的高度与其右子树的高度的差不超过一AVL树的定义public class AVLTreeNode{ private int data; private int height; private AVLTreeNode left; private AVLTreeNode right; public int getData(){ return this.data; } public void原创 2021-04-08 20:31:46 · 278 阅读 · 0 评论 -
给定BST树和两个数K1和K2,输出介于K1~K2两值之间的元素值
递归void rangePrinter(BinarySearchTreeNode root,int k2,int k2){ if(root == null){ return null; } if(root.getData() >= k1){ rangePrinter(root.getLeft(),k1,k2); } if(root.getData() >= k1 && root.getData() <= k2){ System.原创 2021-04-08 20:03:27 · 183 阅读 · 0 评论 -
查找BST树中的第k小元素
利用中序遍历产生有序表,在中序遍历BST树时,记录已访问的节点个数BinarySearchTreeNode kthNode(BinarySearchTreeNode root,int k,int count){ if(root == null){ return null; } BinarySearchTreeNode left = kthNode(root.getLeft,k,count); if(left != null){ return left; } if(+原创 2021-04-07 20:42:40 · 165 阅读 · 0 评论 -
有序链表转化为BST
int length(ListNode node){ int count = 0; if(node == null){ return count; }else{ count++; } while(node.getNext() != null){ count++; node = node.getNext(); } return count;}BinaryTreeNode sortedListToBST(listNode node){ ret原创 2021-04-06 21:27:10 · 122 阅读 · 1 评论 -
给定一个有序数组,转化成BST
如果需要从数组中选择一个元素作为平衡二叉搜索树的根节点,应该选择有序数组的中间元素,在每次迭代中,选择有序数组的中间元素作为子树的根节点,然后以这个元素构建树的一个节点,当该选择元素后,分成两个数组,一个位于该元素的左边,另一个位于该元素的右边,这两个数组就是原始问题的子问题,因为它们都是有序的,而且,是当前节点的左子树和右子树,所以,可以采用分治法实现BinaryTreeNode buildBST(int A[],int left,int right){ BinaryTreeNode newNode原创 2021-04-05 21:13:53 · 317 阅读 · 0 评论 -
判断一颗二叉树是否为BST
对于每个节点,需要检查其左子树的最大值是否小于当前节点的值,右子树的最小值是否小于该节点的值boolean isBST(BinaryTreeNode root){ if(root == null){ reutrn true; } if(root.getLeft() != null && findMax(root.getLeft()) > root.getData()){ return false; } if(root.getRight() != n原创 2021-04-01 22:32:58 · 375 阅读 · 0 评论 -
寻找指向二叉搜索树中的两个节点的最近公共祖先(LCA)
根据二叉搜索树的性质,当从根节点到底部遍历这颗BST树时候,假设两个节点的值为a,b,如果存在一个节点的值介于a b之间,其中的第一个节点就是其最近的公共祖先LCA,如果大于a b,则节点位于该节点的左侧,反之,在右侧BinarySearchTreeNode findLCA(BinarySearchTreeNode root,BinarySearchTreeNode a,BinarySearchTreeNode b){ while(true){ if(a.getData() < root原创 2021-03-31 20:36:34 · 177 阅读 · 0 评论 -
二叉树中删除元素
删除操作有三种情况(1)如果待删除元素为叶子节点,则返回null给双亲节点,将其相应的孩子节点指针设置为null(2) 如果待删除节点有一个孩子节点,通常在这种情况下,只需要将删除节点的孩子节点返回给双亲节点(3) 如果待删除元素有两个孩子节点,通常的做法是从左子树中找到最大的元素来代替原节点的值BinarySearchNode findMax(BinaryTreeNode root){ if(root == null){ return null; } else{原创 2021-03-30 20:50:55 · 436 阅读 · 0 评论 -
二叉搜索树中插入元素
在二叉搜索树中插入数据,首先需要找到插入该数据的位置,遵循与寻找操作相同的机制,就能够找到插入的位置,当找到插入位置时,如果该数据已经存在,那么只需要忽略并且返回,否则,将该数据插入走过的路径的最后位置上BinarySearchTreeNode insert(BinarySearchTreeNode root,int data){ if(root == null){ root = new BinarySearchTreeNode(); if(root == null){原创 2021-03-29 21:36:59 · 517 阅读 · 0 评论 -
二叉树中寻找最大元素java
递归BinaryTreeNode findMax(BinaryTreeNode root){ if(root == null){ return null; } else{ if(root.getRight() == null){ return root; } else{ return findMax(root.getRight()); } }}非递归BinaryTreeNode findMax(BinaryTreeNo原创 2021-03-25 20:46:52 · 293 阅读 · 0 评论 -
二分搜索树查找其最小值java
递归BinarySearchTreeNode findMin(BinaryTreeNode root){ if(root == null){ return null; } else{ if(root.getLeft() == null) return root; else return findMin(root.getLeft()); }}非递归BinarySearchTreeNode findMin(BinaryTreeNode r原创 2021-03-25 20:42:28 · 140 阅读 · 0 评论 -
Java在二分搜索树中查找某元素
思路二叉搜索树的寻找操作简单有效,从根节点开始,基于二叉搜索树的性质移动到左子树或右子树继续搜索,如果待搜索数据与节点数据一致,则返回当前结点,如果待搜索数据小于根节点数据,则搜索当前结点的左子树,否则,搜索当前结点的右子树,如果数据不存在,则返沪一个空指针代码递归:BinarySearchTreeNode find(BinarySearchTreeNode root,int data){ if(root == null) return null; if(data > root原创 2021-03-25 20:31:45 · 290 阅读 · 0 评论