![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 60
Java为主
小写丶H
这个作者很懒,什么都没留下…
展开
-
二叉树进阶题------二叉树的构建及遍历;二叉搜索树转换成排序双向链表;二叉树创建字符串
一.二叉树的构建及遍历二.二叉树搜索树转换成排序双向链表思路代码三.二叉树创建字符串一.二叉树的构建及遍历二.二叉树搜索树转换成排序双向链表输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表(要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继)思路首先我们知道二叉搜索树的一个特点,左子树所有节点小于根节点,根节点小于右子树所有节点。这一题的突破口就是,中序遍历,其中序遍历是一个有序数组。递归解原创 2022-02-07 15:43:36 · 208 阅读 · 10 评论 -
堆排序;快速排序;归并排序
快速排序算法堆排序快速排序递归非递归归并排序递归非递归堆排序时间复杂度:0(N*log(N))空间复杂度:0(1)稳定性:不稳定private static void heapSort(int[] arr) { //建堆 crearHeap(arr); for (int i = 0; i < arr.length-1; i++) { int heapSize=arr.length-i; swap(arr,he原创 2021-12-29 21:08:22 · 1074 阅读 · 16 评论 -
数组中数字出现的次数
这里就把这一类出现过的问题统一解决一下数组中数字出现的次数I.一个整型数组nums中,其他数出现两次,只有一个数出现了一次。思路代码II.一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。思路代码III.在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。思路代码I.一个整型数组nums中,其他数出现两次,只有一个数出现了一次。思路相对简单,我们直接可以想到用异或的方式解决。因为我们知道a^a=0a^0=a所以可以达到很好的去重效果。代码public i原创 2021-12-05 11:56:01 · 689 阅读 · 7 评论 -
二叉树进阶题------前序遍历和中序遍历构造二叉树;中序遍历和后序遍历构造二叉树
根据前中后遍历数组构建二叉树一.根据一棵树的前序遍历与中序遍历构造二叉树思路代码二.根据一棵树的中序遍历与后序遍历构造二叉树思路代码一.根据一棵树的前序遍历与中序遍历构造二叉树输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。思路首先我们可以知道通过前序遍历和中序遍历,就可以知道整个二叉树的结构了。代码private int index=0; public TreeNode buildTree(int[] pr原创 2021-12-03 13:14:49 · 773 阅读 · 4 评论 -
二叉树进阶题------最近公共祖先
最近公共祖先思路代码二叉树进阶题给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。(最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”)p 和 q 均存在于给定的二叉树中。思路自上而下的深度遍历DFS。理解下面这个图,然后看代码注释。代码 public TreeNode lowestCommonAncestor(TreeNode root, TreeNode原创 2021-12-01 20:00:17 · 516 阅读 · 7 评论 -
二叉树 基础题解
二叉树基础题一.相同的树思路代码二.另一棵树的子树思路代码三.二叉树的最大深度思路代码四.平衡二叉树思路代码五.对称二叉树思路代码这些问题都有一个类TreeNode。 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode() {} TreeNode(int val) { this.val = val; } TreeNode(int val,原创 2021-11-13 17:17:56 · 721 阅读 · 7 评论 -
二叉树的遍历(递归+迭代)
二叉树的遍历一.前序遍历思路代码递归迭代二.中序遍历思路代码递归迭代三.后序遍历思路代码递归迭代四.层序遍历思路代码递归迭代一.前序遍历思路代码递归public static void preOrder(Node root){ if(root==null){ return; } System.out.print(root.val+" "); preOrder(root.left); preOrd原创 2021-10-02 17:26:52 · 547 阅读 · 9 评论 -
回文链表;相交链表;合并两个有序链表(递归+迭代);
链表典型例题一.相交链表问题思路代码第一种思路第二种思路二.合并两个有序链表问题思路代码迭代递归三.回文链表问题思路代码一.相交链表问题两个单链表的头节点 A 和 B ,找出并返回两个单链表相交的第一个节点。(如果没有交点,返回 null)思路第一种简单思路(好理解,代码写的相对多):先遍历A,B 然后记录下A,B的长度之差len。让相对长的链表先走 len 步,那么A,B此时就都在统一起跑线上了。再统一向后走,步调一致,然后判断是否存在相交点。第二种思路(代码相对简单好理解):如下图如果相原创 2021-08-25 19:06:50 · 311 阅读 · 10 评论 -
返回中间节点;返回倒数k节点;判断是否为环形链表(返回入环第一个节点)
今天我们使用典型的快慢指针解决这几个典型问题快慢指针典型例题一.返回中间节点问题思路代码二.返回倒数k节点问题思路代码三.判断是否有环形链表问题思路代码如果要返回其环的第一个节点问题思路代码一.返回中间节点问题给定一个头结点为 head 的非空单链表,返回链表的中间结点。(如果有两个中间结点,则返回第二个中间节点)思路这里我们设置两个指针,slow和fast,一个走一步,一个走两步,等fast走完链表,那么slow就在中间节点。这里比较简单也好想,我就不画图了。一些小细节,我也在代码里解释到了原创 2021-08-22 17:35:50 · 462 阅读 · 14 评论 -
翻转链表 (无傀儡节点,递归+迭代)
反转链表问题思路代码迭代递归问题给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。如 1->3->5->7->9,翻转之后:9->7->5->3->1思路因为不是数组结构,不能使用双指针,从两头向中遍历翻转(error);所以我们只能通过改变next域的方向来翻转。代码解释都在注释中。迭代public ListNode reverseList(ListNode head) { //为链表空,直接返回原创 2021-08-18 13:36:37 · 881 阅读 · 5 评论 -
移除链表元素(无傀儡节点,递归+迭代)
移除链表元素问题思路代码问题一个单链表(无傀儡节点/头结点),删除指定的所有元素。如 :1->3->5->7->5->9 删除5之后;变为:1->3->7->9思路可以用递归,但是空间复杂度高。所以使用迭代。遍历一次链表便删除所有指定节点。使用两个两个指针 cur 和 prve 。基本删除思路如图片所示。还要考虑一些细节,没有判断头结点是否删除。所有写到代码注释里面了。代码如果代码没懂,多画图理解一下就会明白。public Li原创 2021-08-15 14:49:55 · 540 阅读 · 3 评论