算法:二叉树基础
二叉树的基础题
拾牙慧者
会点c++、python;
展开
-
leetcode 538. 把二叉搜索树转换为累加树 思考分析
题目给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。提醒一下,二叉搜索树满足下列约束条件:节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。左右子树也必须是二叉搜索树。递归思路二叉搜索树的中序遍历是一个单调递增的数组,我们要做的就是求出从后到前的累加值:[2,5,13]->[20,18,13]数组的从后向前累原创 2020-10-31 13:27:18 · 166 阅读 · 0 评论 -
二叉搜索树的插入、删除、修剪、构造操作(leetcode701、450、669、108)
目录1、leetcode 701. 二叉搜索树中的插入操作1、题目2、递归法3、迭代法1、leetcode 701. 二叉搜索树中的插入操作1、题目给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。输入数据 保证,新值和原始二叉搜索树中的任意节点值都不同。注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回任意有效的结果 。2、递归法递归返回值以及参数返回值为空,因为我们进行的是插入操作,不需要知道插原创 2020-10-30 11:14:12 · 391 阅读 · 0 评论 -
leetcode 235. 二叉搜索树的最近公共祖先 思考分析
目录题目思考迭代法题目给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]思考对于普通二叉树,利用回溯从底向上搜索,遇到一个结点的左子树有p,右子树有q,那么当前结点就是最近公共祖先。对于有序原创 2020-10-28 10:44:21 · 174 阅读 · 0 评论 -
leetcode 236. 二叉树的最近公共祖先 思考分析
目录题目思考分析改进本文章代码思路来源于公众号【代码随想录】题目给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x的深度尽可能大(一个节点也可以是它自己的祖先)。”思考分析1、自下而上遍历对于此题有极大帮助,而后序遍历的特征便是优先处理叶子结点2、如何判断一个节点是结点q和结点p的公共祖先:如果找到一个结点,左子树出现结点p,右子树出现结点q原创 2020-10-27 22:22:39 · 267 阅读 · 1 评论 -
leetcode 501. 二叉搜索树中的众数 思考分析
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {private: void traversal(TreeNode* cur,u原创 2020-10-27 21:28:46 · 168 阅读 · 0 评论 -
LeetCode 530. 二叉搜索树的最小绝对差 思考分析
目录题目思路1:递归遍历得到result数组(单调递增),然后对数组进行前后差分,取最小值思路2:不用数组,进行优化思路3、回顾迭代法求解题目给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。思路1:递归遍历得到result数组(单调递增),然后对数组进行前后差分,取最小值/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *le原创 2020-10-26 20:31:49 · 189 阅读 · 0 评论 -
LeetCode 98. 验证二叉搜索树 思考分析
题目给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。1、利用BST性质:中序遍历结果递增由平衡二叉树的性质可知,若是用中序遍历方法,得到的结果会是递增的。初次外,如果root的结点为空或者只有1个结点的时候,我们认为它也是一棵二叉搜索树。以这样的思路写出的递归代码:/** * Definition for a binary tree原创 2020-10-26 19:38:02 · 167 阅读 · 0 评论 -
leetcode 700. 二叉搜索树中的搜索 思考分析
目录题目1、不考虑BST性质,直接递归遍历2、回顾BST性质3、利用BST性质进行遍历4、简单的迭代方法题目给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。1、不考虑BST性质,直接递归遍历/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; *原创 2020-10-24 21:53:52 · 217 阅读 · 0 评论 -
leetcode 617. 合并二叉树 思考分析
题目给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。思路1:递归遍历两棵树,构造一棵新的树1、递归参数以及返回值返回值:新树的结点参数:两棵旧树2、终止条件两棵旧树的对应的该结点都为NULL3、逻辑(这里直接贴代码和遇到的问题)首先将情况分为4类:如果t1 和t2 都是空结点,那么说明新树的这原创 2020-10-24 19:35:01 · 307 阅读 · 0 评论 -
leetcode 654. 构造最大二叉树 思考分析
题目给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大二叉树。通过给定的数组构建最大二叉树,并且输出这个树的根节点。思路和之前的构造树一样:分成左右区间(子树)递归/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNod原创 2020-10-24 18:36:12 · 186 阅读 · 0 评论 -
leetcode 106. 从中序与后序遍历序列构造二叉树 105. 从前序与中序遍历序列构造二叉树思考分析
目录1、106题目2、参考思路:递归切割数组3、105题目4、同样思路的代码1、106题目2、参考思路:递归切割数组代码参考:公众号:代码随想录后序数组+中序数组以 后序数组(左右中)的最后一个元素作为切割点,先切中序数组,根据中序数组反过来再切割后序数组。一层一层切割下去,每次后序数组最后一个元素就是结点元素。先序数组+中序数组以 先序数组(中左右)的第一个元素作为切割点,先切中序数组,根据中序数组反过来再切割先序数组。一层一层切割下去,每次先序数组第一个元素就是结点元素。先序数组+后序原创 2020-10-23 15:38:39 · 215 阅读 · 0 评论 -
LeetCode 112. 路径总和 、113. 路径总和 II 思考分析
目录112. 路径总和题目递归解递归解,其他人的解法迭代解,其他人的解法113. 路径总和 II题目递归解递归解,参考别人的思路112. 路径总和题目给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明: 叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和 sum = 22,返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。递归解1、函数参数:当前树的根结点、原创 2020-10-22 16:14:07 · 212 阅读 · 0 评论 -
LeetCode 513. 找树左下角的值 思考分析
题目给定一个二叉树,在树的最后一行找到最左边的值。递归解左下角要满足两个条件:1、深度最大的叶子结点2、最左结点:使用前序遍历,优先左边搜索。1、确定递归函数的参数和返回值参数:树的根结点,maxlen记录最大深度,maxleftval记录最大深度最左结点的数值。int maxlen = 0; //全局变量,记录最大深度int maxleftval; //全局变量 最大深度最左节点的数值void traversal(TreeNode* root,int leftlen);2、原创 2020-10-22 13:10:56 · 186 阅读 · 0 评论 -
LeetCode 404. 左叶子之和思考分析
题目计算给定二叉树的所有左叶子之和。如果是下面的树,只有一个左叶子结点4思考分析由此我们可以得到左叶子结点的定义:cur->left !=NULL && cur->left->left==NULL && cur->left->right==NULL递归遍历+累积操作/** * Definition for a binary tree node. * struct TreeNode { * int val; *原创 2020-10-21 21:58:42 · 169 阅读 · 1 评论 -
LeetCode 572. 另一个树的子树 思考分析
题目给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。示例 1:给定的树 s:示例 2:给定的树 s:思路思路:首先层序遍历s树,如果遇到结点值和t根结点值相同的,开始比较以该结点为根结点的树与t树是否相同。这里有一些点需要注意:1、s树中可能有许多结点的值和t根结点值相同,所以我们应该对每次比较的结果做记录,如果有相同则直接返回true,否则必须等所有结点都遍原创 2020-10-21 10:55:55 · 211 阅读 · 0 评论 -
LeetCode 257. 二叉树的所有路径 思考分析
题目给定一个二叉树,返回所有从根节点到叶子节点的路径。说明: 叶子节点是指没有子节点的节点。示例:输入:输出: [“1->2->5”, “1->3”]解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3思路一:深度递归void traversal(TreeNode* cur , vector<string>& paths,string path) { if(cur == NULL) return;原创 2020-10-20 13:55:46 · 254 阅读 · 0 评论 -
LeetCode 110. 平衡二叉树思考分析
题目给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。示例 1:给定二叉树 [3,9,20,null,null,15,7]3/ 9 20/ 15 7返回 true 。示例 2:给定二叉树 [1,2,2,3,3,null,null,4,4]1/ 2 2/ 3 3/ 4 4返回 false 。思路一:递归...原创 2020-10-19 22:11:40 · 213 阅读 · 0 评论 -
LeetCode 222. 完全二叉树的节点个数
题目给出一个完全二叉树,求出该树的节点个数。 说明:完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。示例: 输入:1/ \2 3/ \ /4 5 6输出: 6思路一:层序遍历+计数/** * Definition for a binary tree node. * struct TreeNode { *原创 2020-10-18 23:44:30 · 207 阅读 · 0 评论 -
LeetCode 二叉树、N叉树的最大深度与最小深度(递归解)
目录104. 二叉树的最大深度559. N叉树的最大深度111. 二叉树的最小深度之前的笔记中,已经用层序遍历解决过这个问题了现在试着用深度的解法去求解104. 二叉树的最大深度给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7],3/ 9 20/ 15 7返回它的最大深度 3 。**选择深度遍历方式:**由于我们需要返回深度信息,所原创 2020-10-18 13:20:58 · 1149 阅读 · 0 评论 -
LeetCode 101. 对称二叉树 思考分析
题目给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。1/ 2 2/ \ / 3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:1/ 2 2\ 3 3进阶:你可以运用递归和迭代两种方法解决这个问题吗?思路一,超时层序遍历,然后如果该结点是空结点,往该层子数组中填0,否则填val;当此层所有结点都被遍历了(包括空结点),观察子数组是否对称。然后更新queue,如原创 2020-10-17 20:15:35 · 242 阅读 · 0 评论 -
LintCode 375. 克隆二叉树(深复制)
先序遍历+构造二叉树TreeNode * preorder(TreeNode * root){ if(root==NULL) return NULL; TreeNode * ans; ans=new TreeNode(root->val); if(root->left!=NULL){ ans->left=preorder(root->left); } if(root->right!=NULL){原创 2020-10-17 18:33:52 · 239 阅读 · 0 评论 -
Leetcode226. 翻转二叉树(递归、迭代、层序三种解法)
1、层序法:层序遍历,然后将同一层的所有结点的左右孩子交换/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:原创 2020-10-17 14:51:23 · 485 阅读 · 0 评论 -
二叉树笔记(深度遍历与广度遍历+13道leetcode题目(深度3道、广度10道))
本文章为结合leetcode题目以及公众号“代码随想录”的文章所做的笔记!感觉代码随想录的题目整理真的很好,比自己盲目刷题好很多。目录1、二叉树小记1、满二叉树与完全二叉树2、二叉搜索树3、平衡二叉搜索树AVL4、二叉树存储方式5、二叉树遍历方式6、二叉树的定义2、二叉树深度优先遍历递归算法书写1、leetcode144题:2、leetcode145题:3、leetcode94题:3、二叉树深度优先遍历迭代算法书写1、先序遍历(迭代法)2、中序遍历(迭代法)3、后序遍历(迭代法)4、二叉树深度优先遍.原创 2020-10-15 13:04:09 · 730 阅读 · 0 评论
分享