![](https://img-blog.csdnimg.cn/a3d5b61e57114c408a1efa5909386138.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java
知识点总结
GXR_1116
努力努力再努力
展开
-
[归并排序] 二路归并排序
二路归并排序(基于分治的思想,先分解再合并) 算法思想:先分解,然后两两归并,直到合成一个新的有序表。 相关代码如下: // 归并排序:先分解再合并 void Merge_sort(int[] array, int left, int right) { if (left >= right) return; // 1.分解 int mid = (left + right) / 2; // 从中间划分成两个待排子序列 Merge_sort(array, left, mid原创 2021-10-23 00:15:04 · 359 阅读 · 0 评论 -
[选择排序] 简单选择排序、堆排序
文章目录一、简单选择排序二、堆排序一、简单选择排序 算法思想:假设有n个元素,每一趟选择就是在后面的(n-i+1)个元素中选择最小的元素作为有序子序列的第i个元素,直到第(n-1)趟选择做完。 简单选择排序中元素之间的比较次数,与待排序列的初始状态无关。 相关代码如下: void Select_sort(int[] array) { for (int i = 0; i < array.length; i++) { int min = i; // 用min记录最小元素值的位置原创 2021-10-22 23:26:29 · 145 阅读 · 0 评论 -
[交换排序] 快速排序的非递归实现
快速排序的非递归实现(利用栈)基本步骤: 1.在一次划分的基础上,把被划分两边待排序列的的最左、最右元素依次入栈 2.栈非空时,取栈顶的两个元素,**先出的作为right,后出的作为left,**把它们作为下一次待排序元素区间 3.然后在新的区间的基础上,找基准值…重复上述步骤 4.如果被基准值划分的左右两个区间范围内只有一个元素,则不需要执行入栈操作相关代码如下: void Quick_sort(int[] array, int left, int right) { Stack&原创 2021-10-21 22:03:04 · 107 阅读 · 0 评论 -
[交换排序] 冒泡排序(两种优化)、快速排序(3种方法+两种优化)
文章目录一、冒泡排序1.1 基础的冒泡排序1.2 冒泡排序的优化二、快速排序2.1 基础的快速排序2.1.1 双指针法2.1.2 挖坑法2.1.3 前后指针法2.2 快排的优化(在一定范围内使用直接插入排序)2.3 快排的优化(使用三数取中法确定基准值)一、冒泡排序1.1 基础的冒泡排序 算法思想:从后向前,相邻两个元素进行两两比较,如果后面的元素的值小于前面元素的值,就交换两个元素。一趟冒泡下来,最小的元素就会被放到最前面的位置。这样最多进行n-1趟冒泡,就会把所有的元素全部排好。 相关代码如原创 2021-10-20 23:38:46 · 1222 阅读 · 2 评论 -
[插入排序] 直接插入排序、折半插入排序、希尔排序
直接插入排序(边比较边移动元素)基本思想:把第一个元素当做已排好的序列,从第二个元素开始在原数组的基础上进行就地排序。 void Insert_sort(int[] array){ int tmp = array[0]; for(int i=1; i<array.length; i++){ tmp = array[i]; int j; for(j=i-1; j>=0; j--){ if(tmp < array[j]){ array[j+.原创 2021-10-19 23:14:31 · 173 阅读 · 0 评论 -
[二叉树] 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表要求:1.不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。2.返回链表中的第一个节点的指针。算法思路:首先,利用中序遍历,可以把二叉搜索树转化为有序;然后对各个结点进行指针的转化;最后,找原二叉搜索树的最左端结点并返回。//先编写一个函数,用来转换子树,用pCur来遍历 public TreeNode prev = null; public vo.原创 2021-09-28 22:59:03 · 439 阅读 · 0 评论 -
[二叉树] 从前序与中序遍历序列构建二叉树
给定一棵树的前序遍历 preorder 与中序遍历 inorder,然后构造二叉树并返回其根节点。 public int preIndex = 0; public TreeNode buildTreeChild(int[] preorder, int[] inorder, int inbegin, int inend) { if(inbegin > inend) return null; //1.依次取前序遍历的第一个数,.原创 2021-10-08 22:31:58 · 178 阅读 · 0 评论 -
[二叉树] 打印二叉树中值为x的结点的所有祖先结点的值
代码】[二叉树]打印树中值为x的元素结点的所有祖先。原创 2022-07-28 22:46:39 · 1599 阅读 · 1 评论 -
[二叉树] 二叉树中任意两个结点的最近公共祖先
代码】[二叉树]找二叉树中任意两个结点的最近公共祖先。原创 2022-07-28 22:40:54 · 856 阅读 · 0 评论 -
[二叉树] 树的子结构
代码】[二叉树] 树的子结构。原创 2022-08-16 22:38:19 · 330 阅读 · 0 评论 -
[二叉树] 判断一棵树是不是完全二叉树(递归与非递归求解)
//判断一棵树是否为满二叉树(子问题思路) int hight(TreeNode root){ if(root == null) return 0; return hight(root.left)>hight(root.right)? hight(root.left)+1:hight(root.right)+1; } boolean isComplementTree2(TreeNode root){ if(root == null) return true; .原创 2021-09-28 18:31:57 · 1849 阅读 · 3 评论 -
[二叉树] 判断是否是满二叉树、相似二叉树、相同二叉树
代码】[二叉树]判断是否是满二叉树、相似二叉树、相同二叉树。原创 2022-07-28 22:27:35 · 339 阅读 · 0 评论 -
[二叉树] 求二叉树的高度(递归与非递归两种方法)
代码】[二叉树]求二叉树的高度(递归与非递归两种方法)原创 2022-07-28 22:18:50 · 325 阅读 · 0 评论 -
[二叉树] 求二叉树(叶子)结点的个数(递归与非递归求解)
List item int getSize1(TreeNode root){ //1.利用层次遍历 int size = 0; if(root == null) return 0; Queue<TreeNode> queue = new ArrayDeque<TreeNode>(); queue.offer(root); while(!queue.isEmpty()){ TreeNode cur.原创 2021-09-28 18:15:59 · 1416 阅读 · 0 评论 -
[二叉树] 层序遍历(返回类型为List<List<Integer>>型)
public List<List<Integer>> levelOrder(TreeNode root) { //注意返回类型为List<List<Integer>>型 List<List<Integer>> ret = new LinkedList<>(); if(root == null) return ret; ...原创 2021-09-28 18:06:06 · 467 阅读 · 0 评论 -
[二叉树] 前、中、后序遍历(递归与非递归两种方法)
前序遍历:1.根节点为空,直接返回2.用cur标记当前结点3.cur或栈不为空时:若当前结点不为空,打印,并进栈,一直走到最左边3.cur或栈不为空时:若当前结点为空,栈顶元素出栈,让cur指向其右孩子 //前序遍历:根--左--右 public void preorderTraversal(TreeNode root) { if(root == null) return; System.out.print(root.val); .原创 2021-09-28 18:05:20 · 73 阅读 · 0 评论 -
[单链表] 找两个单链表相交的起始结点
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。public ListNode getIntersectionNode(ListNode headA, ListNode headB) { if(headA==null || headB==null){ return null; } ListNode pA = headA; ListNode p.原创 2021-09-27 21:16:22 · 164 阅读 · 0 评论 -
[单链表] 链表分割
链表分割:现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。基本思想:1.新建两个链表,一个放小于x值的结点,一个放大于x的结点2.用a1,a2,b1,b2分别标记这两个链表的头和尾3.用cur遍历原链表,以头插法把各个结点放到相对应的新链表中4.分析新的两个链表是否有空的情况,若不为空,则把第一个链表的尾拼接到第二个链表的头5.最后一个结点的next置空public cl.原创 2021-09-27 21:12:54 · 499 阅读 · 0 评论 -
[单链表] 判断链表是否有环 + 找入环的第一个结点
链表分割:现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。public class Partition { public ListNode partition(ListNode pHead, int x) { // write code here ListNode a1 = null; //a1作为新的链表的头 ListNode a2 =.原创 2021-09-18 23:00:12 · 269 阅读 · 0 评论 -
[单链表] 链表的回文结构(采用翻转后半段链表,然后从两头开始比较的思想)
链表的回文结构:对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构public boolean chkPalindrome(ListNode A) { //链表为空,不是回文结构 if(A == null){ return false; } //只有一个结点,为回文结构 if(A !=.原创 2021-09-18 22:56:31 · 93 阅读 · 0 评论 -
[单链表] 删除链表中重复的结点
删除链表中重复的结点:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。基本思想:1.设置一个虚拟的新的链表的头结点,其后用来放不重复的结点2.用cur遍历原链表,遇到前后值相等的两个结点,cur就向后走一步3.对于不重复的结点,就尾插到新的链表后面public class Solution { public ListNode deleteDuplication(ListNode pHead) { ListNode newh.原创 2021-09-18 22:55:01 · 1115 阅读 · 0 评论 -
深入理解Java中的继承与多态(包括向上、向下转型)
继承语法结构:class 子类名称 extends 父类名称 { }子类继承了父类除构造方法以外所有的。例如:class Animals{ String name; int age; void eat(){ System.out.println("Animals:eat()"); }}class cat extends Animals{}//cat作为animals的子类,就继承了父类的name、age属性和eat()方法。注:如果父类中有私有的属性或行为,子类也会继承,只原创 2021-09-14 21:09:47 · 418 阅读 · 0 评论