二叉树
追光者2020
没有实力的愤怒毫无意义。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
LeetCode 662. 二叉树最大宽度(层序遍历)
题目描述给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。示例 1:输入: 1 / \ 3 2 / \ \ 5 3 9 输出: 4解释: 最大值出现在树的第 3 层,宽度为 4 (5,3,null,9)。原创 2021-08-26 09:45:36 · 516 阅读 · 0 评论 -
day21:37. 树的子结构(递归)and leetcode 100 相同的树 and leetcode 572另一棵树的子树
问题描述:输入两棵二叉树A,B,判断B是不是A的子结构。我们规定空树不是任何树的子结构。样例使用递归,题目已知空树不是任何树的子结构,所以如果两个树其中一棵为空,那么返回false。需要两步判断1)先序判断pRoot1中的根节点是否满足,如果不包含则遍历pRoot1的左子树和右子树。2)如何判断是否满足就需要进一步判断,如果P2这一个根节点为空,那么判断完毕返回true,如果P1这一个根节点为空,或者 P1对应的值与P2对应的值不相等那么返回false。这些条件都不满足,那么需要判断该节点对应的原创 2020-06-24 10:39:27 · 178 阅读 · 0 评论 -
leetcode 226. 翻转二叉树
class Solution {public: TreeNode* invertTree(TreeNode* root) { dfs(root); return root; } void dfs(TreeNode* root) { if(!root) return; swap(root->right,root->left); dfs(root->left).原创 2021-08-23 11:45:12 · 144 阅读 · 0 评论 -
leetcode 98. 验证二叉搜索树(二叉树的中序遍历)
题目描述给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。使用pre节点保存遍历中的前一个节点,然后pre节点与当前节点p作比较,由于是中序遍历且需要判定是否是二叉搜素树,因此前一个节点pre比当前节点值要小,如果大的话这说明不是二叉搜索树,返回false即可。class Solution {public: bool isValidBS原创 2021-08-18 10:55:09 · 228 阅读 · 0 评论 -
leetcode 116. 填充每个节点的下一个右侧节点指针
题目描述给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:struct Node {int val;Node *left;Node *right;Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。进阶:你只能使用常量级额外空间。使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间原创 2021-08-17 16:22:47 · 137 阅读 · 0 评论 -
leetcode 199. 二叉树的右视图(BFS)
题目描述给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例 1:输入: [1,2,3,null,5,null,4]输出: [1,3,4]示例 2:输入: [1,null,3]输出: [1,3]示例 3:输入: []输出: []右视图,相当于层序遍历的每一层的最后一个节点,因此采用宽搜,到每一层的最后一个节点时就将结果保存下来。class Solution {public: vector<int> r原创 2021-08-16 10:32:02 · 374 阅读 · 0 评论 -
LeetCode 24. 两两交换链表中的节点(递归)
题目描述给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例 1:输入:head = [1,2,3,4]输出:[2,1,4,3]示例 2:输入:head = []输出:[]示例 3:输入:head = [1]输出:[1]该题目是k个为一组翻转链表的特殊情况,k==2,首先基本的想法是找到新的头节点,将新的头结点指向原始的头结点,之后递归进行,递归的时候初始头节点时此时新头的下一个节点。class Solutio原创 2021-08-16 09:57:31 · 142 阅读 · 0 评论 -
leetcode 面试题 04.06. 后继者
题目描述设计一个算法,找出二叉搜索树中指定节点的 “下一个” 节点(也即中序后继)。如果指定节点没有对应的 “下一个” 节点,则返回null。示例 1:输入: root = [2,1,3], p = 1输出: 2示例 2:输入: root = [5,3,6,2,4,null,null,1], p = 6输出: null使用二叉树中序遍历的非递归形式,在遍历中如果找到节点与给定的 p 节点相等的话,将哨兵做个标记,然后根据哨兵来寻找下一个节点。class Solution {public:原创 2021-08-15 15:53:27 · 118 阅读 · 0 评论 -
二叉树根节点到叶子节点的所有路径和
描述给定一个仅包含数字0−9 的二叉树,每一条从根节点到叶子节点的路径都可以用一个数字表示。例如根节点到叶子节点的一条路径是1→2→3,那么这条路径就用123 来代替。找出根节点到叶子节点的所有路径表示的数字之和例如:这颗二叉树一共有两条路径,根节点到叶子节点的路径 1→2 用数字 12 代替,根节点到叶子节点的路径 1→3 用数字13 代替所以答案为+13=25 12+13=25示例1输入:{1,0}返回值:10示例2输入:{1,#,9}返回值:19在遍历的过程中计算根节点到叶节点的原创 2021-07-27 15:25:41 · 1436 阅读 · 0 评论 -
LeetCode 124 二叉树中的最大路径和
题目描述路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。路径和 是路径中各节点值的总和。给你一个二叉树的根节点 root ,返回其 最大路径和 。示例 1:输入:root = [1,2,3]输出:6解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6示例 2:输入:root = [-10,9,20,null,null,15,7]原创 2021-06-05 10:56:54 · 144 阅读 · 0 评论 -
剑指offer 68 Ⅰ二叉搜索树的最近公共祖先
题目描述给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 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-06-05 10:07:08 · 119 阅读 · 0 评论 -
平衡二叉树
输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过 1,那么它就是一棵平衡二叉树。注意:规定空树也是一棵平衡二叉树。在求解二叉树深度的过程中判断二叉树的高度是否大于1,如果大于1,标志位设置为false。class Solution {public: bool flag=true; bool isBalanced(TreeNode* root) { dfs(root); return flag;原创 2021-05-31 10:40:48 · 122 阅读 · 0 评论 -
day8:104. 二叉树的最大深度(递归) leetcode 110二叉树的最小深度
问题描述:给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7],返回它的最大深度 3 。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree**题解:**确实不应该进行人肉递归,不然自己转在里面出不来啦就!找到重复子问题,并用数学归纳法总结出来。本题思原创 2020-06-24 10:30:50 · 215 阅读 · 0 评论 -
leetcode 543. 二叉树的直径
题目描述给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。示例:输入:[1,2,3,4,5,null,null,null,null,null,6]输出:4题解:时间复杂度:O(n)空间复杂度:O(树的深度)使用深度优先遍历,递归的几个要素,首先递归出口,其次递归表达式。想想要是让你求解树的深度时你会怎么样求解,从树的叶子节点到树的根节点依次从下到上遍历,已知叶子节点的深度为1,那么其对应的根节点深度为max(l原创 2021-05-17 17:28:08 · 119 阅读 · 0 评论 -
leetcode 993. 二叉树的堂兄弟节点
题目描述在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。我们给出了具有唯一值的二叉树的根节点 root ,以及树中两个不同节点的值 x 和 y 。只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true 。否则,返回 false。示例输入:root = [1,2,3,null,4,null,5], x = 5, y = 4输出:true基本思路:找到给定的两个节点的父原创 2021-05-17 15:06:26 · 182 阅读 · 0 评论 -
剑指 Offer 28. 对称的二叉树
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。示例 1:输入:root = [1,2,2,3,4,4,3]输出:true示例 2:输入:root = [1,2,2,null,3,null,3]输出:false对称的话,对于左右子树其左子树的左儿子和右子树的右儿子值相等右子树的左儿子和左子树的右儿子值相等如果节点值相等的话,就去看其儿子节点,如果不相等直接返回false。当然二者若都是空也返回true。class Solution原创 2021-05-10 21:21:44 · 118 阅读 · 0 评论 -
LeetCode 108. 将有序数组转换为二叉搜索树
题目描述给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。链接:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree看着这张图才想着取数组中的中间值,看牛客网的题目描述完全没思路。LeetCode上对于该题解有相应的证明,leetcode1382.本题目的大原创 2021-05-07 21:56:40 · 155 阅读 · 0 评论 -
day37:二叉搜索树与双向链表(递归) and leetcode 36 二叉搜索树与双向链表
问题描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。注意:需要返回双向链表最左侧的节点。例如,输入下图中左边的二叉搜索树,则输出右边的排序双向链表。巧妙地利用二叉搜索树的特点,二叉搜索树是树的中序遍历,就在中序递归遍历的基础上改了一点点,用一个pre指针保存中序遍历的前一个结点。因为是中序遍历,遍历顺序就是双线链表的建立顺序;每一个结点访问时它的左子树肯定被访问过了,所以放心大胆的改它的left指针,不怕树断掉;同理,pr原创 2020-07-02 11:00:47 · 201 阅读 · 0 评论 -
完全二叉树结点总数/leetcode 222. 完全二叉树的节点个数(二分)
题目描述给定一棵完全二叉树的头节点head,返回这棵树的节点个数。如果完全二叉树的节点数为N,请实现时间复杂度低于O(N)的解法。示例1输入 {1,2,3}返回值 3满二叉树节点的计算方法:如果一个二叉树的层数为K,且结点总数是(2^k) -1。如果左右子树层数相同,那么可以按照满二叉树公式计算节点;如果左右子树层数不同,那么需要一直向下遍历,该棵树的节点个数等于1+左子树节点数+右子树节点数。此时与普通二叉树的计算方式类似,只是如果是左右子树高度相等的话,那么可以直接计算,不需要递原创 2021-05-07 20:41:58 · 1097 阅读 · 0 评论 -
二叉搜索树的第k小个结点
题目描述给定一棵二叉搜索树,请找出其中的第k小的TreeNode结点。示例1输入 {5,3,7,2,4,6,8},3返回值 {4}说明 按结点数值大小顺序第三小结点的值为4题目中并未给出 k 的取值范围,k 有可能比给定的二叉树节点要多,也有可能是0个。如果是0个的话,则返回nullptr,如果k比给定的二叉树节点要多的话,那么也返回nullptr。在dfs 这个函数中,k 使用的是引用,ans 保存的是 k ==0 时的节点,dfs 递归结束 k 有可能小于0,因此当 k <=原创 2021-05-07 16:31:21 · 273 阅读 · 0 评论 -
leetcode 617 合并二叉树
题目描述给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。链接:https://leetcode-cn.com/problems/merge-two-binary-trees三种情况:两个二叉树对应的节点均不为空,合并后的二叉树节点为二者之和。两个二叉树对应的节点有一个为空,那么合并后的二叉树的对应原创 2021-05-07 15:29:26 · 205 阅读 · 0 评论 -
day23:44. 分行从上往下打印二叉树(层序遍历)(BFS) LeetCode 429. N 叉树的层序遍历
问题描述:从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印到一行。样例二叉树的遍历,使用到了队列,本题中使用到了广度优先遍历,并且还要求区分每一层。设置一个nullptr来区分层与层。在每一层技术的时候加入nullptr,以表示上一层结束,进入了下一层,首先遍历根节点,根节点可以看做一层,所以加入nullptr,然后遍历下一层,利用队列先进先出的性质,先找到第一个节点,然后将该节点的值放入到res中,如果该节点有左右子节点,那么将其放入队列q中,如果该节点为空,那么意味着到了nu原创 2020-06-24 10:39:47 · 190 阅读 · 0 评论 -
剑指offer27 二叉树的镜像
题目描述https://leetcode-cn.com/problems/er-cha-shu-de-jing-xiang-lcof/迭代版本class Solution {public: TreeNode* mirrorTree(TreeNode* pRoot) { queue<TreeNode*> q; if(pRoot) q.push(pRoot); while(q.size()) {原创 2021-05-07 11:35:31 · 118 阅读 · 0 评论
分享