数据结构
碎花喵
这个作者很懒,什么都没留下…
展开
-
二叉搜索树中的众数(1.我用占空间坐的,而且针对所有二叉树。技术包括map放到vector中排序等2.我最喜欢的有序重复边走边找3.直接在dfs过程中拿值(第3种要二刷))
给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。假定 BST 有如下定义:结点左子树中所含结点的值小于等于当前结点的值结点右子树中所含结点的值大于等于当前结点的值左子树和右子树都是二叉搜索树例如:给定 BST [1,null,2,2],返回[2].提示:如果众数超过1个,不需考虑输出顺序进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)/** * Definition for a binary tree node原创 2021-07-26 16:06:44 · 145 阅读 · 0 评论 -
2021-07-26
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。示例 1:输入:nums = [-10,-3,0,5,9]输出:[0,-3,9,-10,null,5]解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:示例 2:输入:nums = [1,3]输出:[3,1]解释:[1,3] 和 [3,1] 都是高度平衡二叉搜索树。提示原创 2021-07-26 11:37:02 · 90 阅读 · 0 评论 -
左叶子之和(按之前的规律三个节点不能完全解决的情况下再加,想了一下一遍过,绝绝子)
计算给定二叉树的所有左叶子之和。示例:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr),原创 2021-07-26 11:21:03 · 77 阅读 · 0 评论 -
翻转二叉树(和比较值无关的时候就不用判断左右子树是否为NULL)
翻转一棵二叉树。示例:输入:输出:而且至少要把最关键的那一步做了。再递归。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) :原创 2021-07-23 09:38:07 · 86 阅读 · 0 评论 -
后序遍历(迭代版)
给定一个二叉树,返回它的 后序 遍历。示例:进阶: 递归算法很简单,你可以通过迭代算法完成吗?解:while( 栈非空){if( p 非空){}else{}}/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(null原创 2021-07-22 13:48:56 · 1056 阅读 · 0 评论 -
对称二叉树(看图,不是简单一个左右子树的比较,而是实际上涉及两棵树,但也要从当做只有三个节点开始看)
给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullpt原创 2021-07-22 09:49:58 · 88 阅读 · 0 评论 -
二叉树的最小深度(比最大复杂一点因为需要忽略空节点,不忽略的话会算进去就变成最小了+深度指的是到根节点,而不是到空节点的距离)
给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。示例 1:输入:root = [3,9,20,null,null,15,7]输出:2示例 2:输入:root = [2,null,3,null,4,null,5,null,6]输出:5提示:树中节点数的范围在 [0, 105] 内-1000 <= Node.val <= 1000/** * Definition for a binary tree原创 2021-07-21 17:35:49 · 123 阅读 · 0 评论 -
复杂链表的复制(什么是复杂链表?难点在哪?)
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回原参数中的节点引用,否则判题程序会直接返回空)问题:random指向一个随机的ListNode*,这个随机值可能没有创建,所以依次复制会出现错误。 random的复制成了难题。解题思路第一步,在每个节点的后面插入复制的节点。第二步,对复制节点的 random 链接进行赋值。.原创 2021-04-07 16:50:43 · 107 阅读 · 0 评论 -
二叉树的最近公共祖先
前文:二叉搜索树的最近公共祖先当然也能用本文的方法直接解。给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1Output: 3Explanation: The LCA of n.原创 2021-04-06 19:48:02 · 73 阅读 · 0 评论 -
二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树:root =[6,2,8,0,4,7,9,null,null,3,5]示例 1:输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8输出: 6解释:...原创 2021-04-06 19:39:47 · 156 阅读 · 0 评论 -
二叉搜索树的第k个结点
题目描述给定一棵二叉搜索树,请找出其中的第k小的TreeNode结点。示例1输入复制{5,3,7,2,4,6,8},3返回值复制{4}说明按结点数值大小顺序第三小结点的值为4 ①我写的需要多一个内存的:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : va原创 2021-04-04 19:15:13 · 92 阅读 · 0 评论 -
二叉搜索树转双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。题意简单例子图示:看这个例子涵盖情况较多:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solut..原创 2021-04-04 18:23:31 · 1162 阅读 · 0 评论 -
二叉树中和为某一值的路径(回溯法void backtracking(vector<vector<int>>&res;vector<int> middle;))
题目描述输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。示例1输入复制{10,5,12,4,7},22返回值复制[[10,5,7],[10,12]]示例2输入复制{10,5,12,4,7},15返回值复制[]/*struct TreeNode { int val; struct TreeNode *left; s.原创 2021-04-04 16:57:07 · 153 阅读 · 0 评论 -
二叉搜索数的后序遍历序列(对后续遍历的理解不深)
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。(ps:我们约定空树不是二叉搜素树)示例1输入复制[4,8,6,12,16,14,10]返回值复制true注意看注释: //序列最后一个元素是根节点,而二叉搜索树的根节点左边的序列值比根小,右边的比根大。 //根据这个特性,将序列分为两半,左边序列的值比根节点小,右边序列的值比根节点...原创 2021-04-04 16:28:27 · 121 阅读 · 0 评论 -
按之字形顺序打印二叉树(易错)(因为到了只变一下,整体的还是原来的那棵树的进入顺序,直接改变原来的进入顺序会乱)
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。示例1输入复制{8,6,10,5,7,9,11}返回值复制[[8],[10,6],[5,7,9,11]]分析:(易错)(因为到了只变一下,整体的还是原来的那棵树的进入顺序,直接改变原来的进入顺序会乱)直接改变原来的进入顺序会错误打印成[[8],[10,6],[9,11,5,7]]。可以引入一个count变量原创 2021-04-04 12:24:16 · 80 阅读 · 0 评论 -
把二叉树打印成多行(带层次的BFS,代码在while基础上加个for)
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。示例1输入复制{8,6,10,5,7,9,11}返回值复制[[8],[6,10],[5,7,9,11]]自己写:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL)原创 2021-04-04 11:49:49 · 70 阅读 · 0 评论 -
对称的二叉树(对称:与自己的镜像二叉树相同)
题目描述请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。示例1输入复制{8,6,6,5,7,7,5}返回值复制true示例2输入复制{8,6,9,5,7,7,5}返回值复制false/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; Tre原创 2021-04-04 11:31:08 · 114 阅读 · 0 评论 -
二叉树的下一个节点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。两种情况情况1.这种情况下得找自己祖先是哪个隔代祖先的左子树。如果一直是右子树到了根节点,那说明到头了,下一个是null。情况2.理解:※ 右子树的最左节点。/*struct TreeLinkNode { int val; struct TreeLinkNode *left; struct TreeLinkNode.原创 2021-04-01 21:02:14 · 67 阅读 · 0 评论 -
(自己写,规范)根据前序遍历和中序遍历重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。示例1输入复制[1,2,3,4,5,6,7],[3,2,4,1,6,5,7]返回值复制{1,2,5,3,4,6,7}/** * Definition for binary tree * struct TreeNode {原创 2021-04-01 19:40:31 · 87 阅读 · 0 评论 -
实现 Trie (前缀树)
实现一个 Trie (前缀树),包含insert,search, 和startsWith这三个操作。示例:Trie trie = new Trie();trie.insert("apple");trie.search("apple"); // 返回 truetrie.search("app"); // 返回 falsetrie.startsWith("app"); // 返回 truetrie.insert("app"); trie.search("app");...原创 2021-03-17 21:08:57 · 136 阅读 · 0 评论