数据结构与算法
文章平均质量分 51
@Better@
持续学习(用户ID是随机生成的,非真实qq号)
展开
-
数据结构与算法框图
原创 2021-03-03 14:11:39 · 139 阅读 · 0 评论 -
二叉树小结(附Java代码可直接运行)
二叉树常见类型1、满二叉树一棵二叉树的结点要么是叶子结点,要么它有两个子结点(如果一个二叉树的层数为K,且结点总数是(2^k) -1,则它就是满二叉树。)层数与此层节点数的对应关系:第K层,节点数为2^(K)。K从0开始。计算公式等比数列求和公式最终得出2、完全二叉树若设二叉树的深度为k,除第 k 层外,其它各层 (1~k-1) 的结点数都达到最大个数,第k 层所有的结点都连续集中在最左边,这就是完全二叉树。3、平衡二叉树它或者是一颗空树,或它的左子树和右子树的深度之差(平衡因原创 2021-03-03 13:52:44 · 209 阅读 · 0 评论 -
剑指 Offer 68 - II. 二叉树的最近公共祖先
题目给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。(相当于是把68-I的搜索二叉树换成了普通的二叉树)解题思路来源:作者:jyd链接:https://leetcode-cn.com/problems/er-cha-shu-de-zui-jin-gong-gong-zu-xian-lcof/solution/mian-shi-ti-68-ii-er-cha-shu-de-zui-jin-gong-gon-7/来源:力扣(LeetCode)换成普通二叉树后,没有了搜索二叉树的定义条件,因此原创 2021-03-02 21:25:15 · 120 阅读 · 0 评论 -
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
题目给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]解题思路来源:作者:jyd链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-z原创 2021-03-02 19:53:38 · 86 阅读 · 0 评论 -
剑指 Offer 55 - II. 平衡二叉树
题目输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。最初级的解法:这道题本身就是基于Offer55-I出发的,先采用层序遍历的思想,把每一层的节点都保存到queue队列中,然后把每个节点的左右子树分别传到maxDepth()函数中,求解其左右子树的最大深度,然后进行比较即可,若出现左右子树深度差大于1的情况,则直接return。这个方法复杂度实在是有点高,时间复杂度最差应该是O(N^2),进而导致时间超时。/** * D原创 2021-03-02 11:04:51 · 64 阅读 · 0 评论 -
剑指 Offer 55 - I. 二叉树的深度
题目输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。解题思路来源:作者:jyd链接:https://leetcode-cn.com/problems/er-cha-shu-de-shen-du-lcof/solution/mian-shi-ti-55-i-er-cha-shu-de-shen-du-xian-xu-bia/来源:力扣(LeetCode)树的遍历方式总体分为两类:深度优先搜索(DFS)、广度优先搜索(原创 2021-03-01 22:41:15 · 185 阅读 · 0 评论 -
剑指 Offer 54. 二叉搜索树的第k大节点
题目给定一棵二叉搜索树,请找出其中第k大的节点。解题思路来源:作者:jyd链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/solution/mian-shi-ti-54-er-cha-sou-suo-shu-de-di-k-da-jie-d/来源:力扣(LeetCode)本文解法基于此性质:二叉搜索树的中序遍历为 递增序列 。根据以上性质,易得二叉搜索树的 中序遍历倒序 为 递减序列原创 2021-03-01 20:50:45 · 118 阅读 · 0 评论 -
剑指 Offer 37. 序列化二叉树
题目请实现两个函数,分别用来序列化和反序列化二叉树。解题思路:来源:作者:jyd链接:https://leetcode-cn.com/problems/xu-lie-hua-er-cha-shu-lcof/solution/mian-shi-ti-37-xu-lie-hua-er-cha-shu-ceng-xu-bian-/来源:力扣(LeetCode)通常使用的前序、中序、后序、层序遍历记录的二叉树的信息不完整,即唯一的输出序列可能对应着多种二叉树可能性。题目要求的 序列化 和 反序列化原创 2021-03-01 10:53:56 · 85 阅读 · 1 评论 -
剑指 Offer 34. 二叉树中和为某一值的路径
题目输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。解题思路来源leetcode 作者:jyd链接:https://leetcode-cn.com/problems/er-cha-shu-zhong-he-wei-mou-yi-zhi-de-lu-jing-lcof/solution/mian-shi-ti-34-er-cha-shu-zhong-he-wei-mou-yi-zh-5/来源:力扣(LeetCod原创 2021-02-28 21:07:56 · 66 阅读 · 0 评论 -
剑指 Offer 33. 二叉搜索树的后序遍历序列
题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。原创 2021-02-27 10:35:15 · 103 阅读 · 0 评论 -
剑指 Offer 32 - III. 从上到下打印二叉树 III
题目请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。解题思路来源于leetcode,作者:jyd链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof/solution/mian-shi-ti-32-iii-cong-shang-dao-xia-da-yin-er–3/来源:力扣(Leet原创 2021-02-25 21:29:57 · 75 阅读 · 0 评论 -
剑指 Offer 32 - II. 从上到下打印二叉树 II
题目从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。解题思路来源于leetcode,作者:jyd链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-ii-lcof/solution/mian-shi-ti-32-ii-cong-shang-dao-xia-da-yin-er-c-5/来源:力扣(LeetCode)方法一其实和剑指 Offer 32 - I.差不多,就是在那原创 2021-02-25 19:39:56 · 76 阅读 · 0 评论 -
剑指 Offer 32 - I. 从上到下打印二叉树
题目从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。题解来源于作者:jyd链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-lcof/solution/mian-shi-ti-32-i-cong-shang-dao-xia-da-yin-er-ch-4/来源:力扣(LeetCode)解题思路:题目要求的二叉树的 从上至下 打印(即按层打印),又称为二叉树的 广度优先搜索(BF原创 2021-02-25 11:19:24 · 64 阅读 · 0 评论 -
剑指 Offer 28. 对称的二叉树
题目请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的题解这道题本身比较简单一些,来源于作者:jyd链接:https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof/solution/mian-shi-ti-28-dui-cheng-de-er-cha-shu-di-gui-qing/来源:力扣(LeetCode)解题思路:对称二叉树定义: 对于树中 任意两个对称节点 L 和 R ,一定原创 2021-02-25 10:21:56 · 81 阅读 · 0 评论 -
剑指 Offer 27. 二叉树的镜像
题目请完成一个函数,输入一个二叉树,该函数输出它的镜像。解法一:递归来源于leetcode作者:jyd链接:https://leetcode-cn.com/problems/er-cha-shu-de-jing-xiang-lcof/solution/mian-shi-ti-27-er-cha-shu-de-jing-xiang-di-gui-fu-/来源:力扣(LeetCode)根据二叉树镜像的定义,考虑递归遍历(dfs)二叉树,交换每个节点的左 / 右子节点,即可生成二叉树的镜像递归解析原创 2021-02-24 22:57:52 · 68 阅读 · 0 评论 -
剑指 Offer 26. 树的子结构
题目输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。(以下内容均来自leetcode作者:jyd链接:https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof/solution/mian-shi-ti-26-shu-de-zi-jie-gou-xian-xu-bian-li-p/。大佬太牛皮,我就是跟着写一下而已)解题思路若树 BB 是树 AA 的子结构,则原创 2021-02-24 15:25:11 · 58 阅读 · 0 评论 -
剑指 Offer 09. 用两个栈实现队列
题目用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。题解官方题解(来源lee原创 2021-02-24 14:29:17 · 62 阅读 · 0 评论 -
剑指 Offer 07. 重建二叉树
题目输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。题解官方解(只看了第一种,把相关的过程手写出来了,第二种还没看,脑袋疼~)class Solution { private Map<Integer, Integer> indexMap; public TreeNode myBuildTree(int[] preorder, int[] inorder, int preorder_left, int preo原创 2021-02-23 23:22:41 · 67 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表
题目输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2]输出:[2,3,1]限制:0 <= 链表长度 <= 10000来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof题解官方题解方法一:栈栈的特点是后进先出,即最后压入栈的元素最先弹出。考虑到栈的这一特点,使用栈将链表元素顺序倒置。从链原创 2021-02-18 22:15:02 · 55 阅读 · 0 评论 -
希尔排序
原理希尔排序这个名字,来源于它的发明者希尔,也称作“缩小增量排序”,是插入排序的一种更高效的改进版本。我们知道,插入排序对于大规模的乱序数组的时候效率是比较慢的,因为它每次只能将数据移动一位,希尔排序为了加快插入的速度,让数据移动的时候可以实现跳跃移动,节省了一部分的时间开支。即通过gap来设置跳跃间距,刚开始gap较大,跳跃较快,随后gap逐渐减小至1。其实总的来说,就是基于插入排序算法,加上了一个gap跳跃,加快插入速度。复杂度计算时间复杂度:O(N^1.3) 大概是这样,因为不同的gap计算方原创 2021-02-17 12:32:41 · 139 阅读 · 0 评论 -
插入排序
基本思想:每一步将一个待排序的数据插入到前面已经排好序的有序序列中,直到插完所有元素为止。复杂度时间复杂度:O(N^2)计算公式:空间复杂度:O(1)void StraightSort(int *arr,int len){ int temp; int i; int j; for (i = 1;i < len;i++) { temp = arr[i]; for (j = i - 1;j >= 0 && arr[j] > tmp;j--)原创 2021-02-16 21:22:46 · 58 阅读 · 0 评论 -
排序算法小结
区别1.冒泡排序是比较相邻位置的两个数,而选择排序是按顺序比较,找最大值或者最小值;2.冒泡排序每一轮比较后,位置不对都需要换位置,选择排序每一轮比较都只需要换一次位置;3.冒泡排序是通过数去找位置,选择排序是给定位置去找数;冒泡排序优缺点1.优点:比较简单,空间复杂度较低,是稳定的;2.缺点:时间复杂度太高,效率慢;选择排序优缺点1.优点:一轮比较只需要换一次位置;2.缺点:效率慢,不稳定(举个例子5,8,5,2,9 我们知道第一遍选择第一个元素5会和2交换,那么原序列中2个5的相对原创 2021-02-16 21:46:31 · 94 阅读 · 0 评论 -
冒泡排序
原理相邻元素之间比较,然后依次把较小的元素挪到前面。复杂度分析的4个概念1.最坏情况时间复杂度:代码在最坏情况下执行的时间复杂度。2.最好情况时间复杂度:代码在最理想情况下执行的时间复杂度。3.平均时间复杂度:用代码在所有情况下执行的次数的加权平均值表示。4.均摊时间复杂度:在代码执行的所有复杂度情况中绝大部分是低级别的复杂度,个别情况是高级别复杂度且发生具有时序关系时,可以将个别高级别复杂度均摊到低级别复杂度上。基本上均摊结果就等于低级别复杂度。复杂度计算双层for循环,时间复杂度为O(N原创 2021-02-16 20:24:14 · 102 阅读 · 0 评论 -
剑指Offer05 替换空格
题目请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:输入:s = “We are happy.”输出:“We%20are%20happy.”限制:0 <= s 的长度 <= 10000来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof题解来源于leetcodepublic class Offer05 { public static void main(S原创 2021-02-16 15:19:36 · 60 阅读 · 1 评论 -
剑指 Offer 04. 二维数组中的查找
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof /* 2、标志位法 选左上角,往右走和往下走都增大,不能选 选右下角,往上走和往左走都减小,不能选 选左下原创 2021-02-07 00:15:41 · 55 阅读 · 0 评论 -
选择排序算法改进随笔
快速排序算法改进随笔/**这是一道快排改进的小测试,想法,在一次遍历中直接选取出最大值和最小值,然后分别移动到头尾, * 主要难点在于边界的处理,因为使用了两次swap,第一次使用swap会造成index变化,第二次使用swap的时候就需要注意。 * 主要是两种情况:当最大值出现在头,或者最大值出现在头,最小值出现在尾时。 */public class AdvancedFastAlgorithm { public static void main(String[] args) {原创 2021-02-06 00:11:36 · 155 阅读 · 0 评论 -
剑指Offer题解
仅仅是个人的简单记录03 数组中重复的数字原创 2021-02-03 00:05:03 · 155 阅读 · 0 评论 -
剑指Offer03. 数组中重复的数字
03 数组中重复的数字找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。03 题解官方解法:class Solution { public int findRepeatNumber(int[] nums) { int repeat=0; Set<Integer> set = new Hash原创 2021-02-02 23:52:59 · 81 阅读 · 1 评论