摘要:一、题目:在二叉树中找到累加和为指定值的最长路径长度 给定一棵二叉树的头节点head和一个32位整数sum,二叉树节点值类型为整型,求累加和为sum的最长路径长度。路径是指从某个节点往下,每次最多选择一个孩子节点或者不选所组成的节点链。 采用两个递归思路:时间复杂度O(N2),空间复杂度O(1) 代
阅读全文
摘要:时间/空间复杂度分析 时间复杂度均为O(n);空间复杂度平均情况下为O(logn),最坏情况下为O(n). Morris遍历:时间为O(n),空间为O(1) 一、前序遍历: 递归方式: 非递归方式:时间复杂度O(n),空间复杂度O(n) 二、中序遍历: 递归方式: 非递归方式: 三、后序遍历: 递归
阅读全文
摘要:一、题目:合并两个有序的单链表 思路:时间复杂度O(M+N),空间复杂度O(1) 简单来说就是在原来的链表上采用三个指针来操作两个链表。 若是合并两个无序链表成有序链表,先将两个链表用冒泡或快排等方法排序,再合并。 代码: 二、题目:按照左右半区的方式重新组合单链表 思路:时间复杂度O(N),空间复
阅读全文
摘要:一、题目:两个单链表相交的一系列问题 思路: 1、首先分别判断两个链表是否有环。如果一个有环,一个无环,则表明肯定不相交。 思路:设置两个指针,一个慢slow【每次只走一步】,一个快fast【每次走两步】,如果快的走完全程,即走到None,则表示没有环,如果两个指针一直走下去,且存在slow = f
阅读全文
摘要:一、题目:将单向链表按某值划分为左边小、中间相等、右边大的形式 简单的思路:时间O(N),空间O(N) 采用一个数组来存储链表中的值,然后对该数组进行快排,然后再连成链表,快排思想如下图所示: 代码: 进阶思想:时间O(N),空间O(1) 代码: 二、题目:实现单链表的选择排序: 要求:额外空间为O
阅读全文
摘要:一、题目:判断一个链表是否为回文结构 简单思路:时间O(N),空间O(N) 采用栈来存储链表值,再从栈中弹出值(逆序),如果和链表顺序值一样,则为回文结构。 eg:1→2→1,顺序:121,倒序:121。则为回文。 1→3→2,顺序:132,倒序:231,不为回文。 代码: 空间省一半的思路:时间O
阅读全文
摘要:1、题目:环形单链表的约瑟夫问题 普通思路:时间复杂度O(n × m) 代码: 题目思路:时间O(n): 每隔m个删除,超过n的大小,则取余来删除。 递归思路: 从1人环的0计算到10人环,结果为4。转化公式: 由图知,10人环中最后入海的是4号,现由其在1人环中的对应编号0来求解。 公式:其中,m
阅读全文
摘要:1、题目:反转单链表或双链表 要求:如果链表长度为N,时间复杂度为O(N),额外的空间复杂度为O(1) 反转单链表的思路: 1 → 2 → 3 → 4 → 5 (1)first = head = 1 循环: temp = head.next 2 head.next = temp.next 1 → 3
阅读全文
摘要:一、题目:在单链表和双链表中删除倒数第K个节点 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点。 要求:如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1) 单链表思路: 遍历链表,每移动一步,K-1。如果链表结束,K>0 ,则不存在倒数第
阅读全文
摘要:一、实现一个链表 代码1: 代码2: 二、题目:复制含有随机指针节点的链表 简单的思路: 采用一个字典存储,key存储原来链表结构,value存储新建链表结构。返回结果直接为key头结点对应的value值。 代码: 进阶的思路: 步骤1:将复制的链表插入到原来的链表中,比如:1→2→3→None。变
阅读全文
摘要:一、题目:生成窗口最大值数组(要求时间复杂度为O(N)) 有一个整型数组arr和一个大小为w的窗口从数组的最左边滑到最右边,窗口每次向右边滑一个位置。 思路: 来自 https://blog.csdn.net/qq_32583189/article/details/53055618?utm_sour
阅读全文
摘要:一、题目:仅用递归函数和栈操作逆序一个栈 将一个栈里面的元素逆序,只能用递归函数来实现,不能用其他数据结构。 思路: 为了将栈逆序,只需要按顺序将栈顶至栈底的元素拿出并移除,放置到栈顶中,这样就可以将栈逆序。 两个递归函数: 一个将栈底元素取出。 一个将剩下的栈元素逆序。 如: 输入栈{1, 2,
阅读全文
摘要:一、题一 1、设计一个有getMin功能的栈 题目:实现一个特殊的栈,在实现栈的基本功能基础上,再实现返回栈中最小元素的操作。 要求:(1)pop、push、getMin操作的时间复杂度都是O(1)。(2)设计的栈类型可以使用现成的栈结构。 2、思路: 使用两个栈,一个栈保存当前栈中的元素,记做st
阅读全文
摘要:1、输出树的所有路径:(前序遍历,深度遍历的特例) 1、二叉树中的最大路径和 给定一个非空二叉树,返回其最大路径和。 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。 示例 1: 示例 2: ############超出时间限制 2、路径求
阅读全文
摘要:1、序列化:层次遍历【用字符串来存储】 2、反序列化:用队列存已经建立的节点,从序列化后的字符串列表取数来建立树 二、前序遍历的序列化: 代码: 反序列化: 3、前序遍历和中序遍历反序列化
阅读全文
摘要:1、二叉树的反向层次遍历 2、最长同值路径 给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。 注意:两个节点之间的路径长度由它们之间的边数表示。 示例 1: 输入: 输出: 3、找到出现最多值的节点。【递归+Counter字典】
阅读全文
摘要:1、判断两颗树是否一样。(递归) 2、判断一颗树是否为另外一颗的子树:【在判断是否一样树之上还加一层循环】(递归加循环) 法二:转化成字符串,判断字符串1是否在字符串2之中。 3、寻找重复的子树 给定一棵二叉树,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。 两棵树
阅读全文
摘要:1、最大深度:(递归) 2、树的直径长度【对每个节点进行一个左子树高度加右子树高度的计算】 给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。 示例 : 给定二叉树 返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1
阅读全文
摘要:1、求树的所有路径和: 2、交换左右子树 3、求树的每层平均值 4、二叉树的层次遍历 5、二叉树的第二小节点 6、最长同值路径: 7、判断一棵树是否为高度平衡二叉树
阅读全文
摘要:1、树的类实现: 2、最大深度:(递归) 3、交换左右子树: (1)递归实现 (2)栈实现 4、求树的每层平均值: (1)(DFS深度优先遍历) (2)(BFS广度优先搜索) 5、判断两颗树是否相同(递归) 6、输出树的所有路径:(前序遍历,深度遍历的特例) 7、二叉树的层次遍历:(BFS) 8、将
阅读全文