二叉树
文章平均质量分 62
记录关于二叉树的那些事
我只是一只自动小青蛙
这个作者很懒,什么都没留下…
展开
-
二叉树大杂烩
本文记录二叉树相关题目一、把二叉搜索树转换为累加树538.把二叉搜索树转换为累加树给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。1.1解题思路看起来很乱,其实就是将二叉树对应的升序数组从后到前累加求和如原始数组[2,5,13]累加后的数组就是[20,18,13]因此我们右中左遍历二叉树,然后依次累加就可以了1.2class Solution原创 2021-06-21 21:16:44 · 98 阅读 · 2 评论 -
二叉树(十七):二叉搜索树的节点删除与修剪二叉树
450.删除二叉搜索树中的节点给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一、二叉搜索树的节点删除方法1、二叉搜索树的节点删除主要有两个过程:找到要删除的节点删除该节点,并调整二叉树的结构2、因此,共有两大类五种情况第一类 没找到要删除的节点 :遍历到空节点仍没有找到,直接返回第二类 找到了要删除的节点,该类共有四种情况:待删除节点左右孩子都为空(叶子节点.原创 2021-06-21 18:47:43 · 1037 阅读 · 0 评论 -
二叉树(十六):二叉搜索树中的插入操作
一、二叉搜索树中的插入操作二叉搜索树中的插入操作给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。插入方法:当不考虑改变树的结构是,只要遍历二叉搜索树,找到空节点,插入元素就可以了1、递归方法一(使用返回值完成父子节点赋值操作)(推荐)注意这里通过递归函数返回值完成父子节点原创 2021-06-21 15:42:10 · 1700 阅读 · 0 评论 -
二叉树(十五):二叉树的最近公共祖先
一、二叉树的最近公共祖先二叉树的最近公共祖先给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”1、解题思路要想解决公共祖先问题,就要从下向上查找,因此我们要使用后序遍历来遍历二叉树。递归三要素:递归函数返回值及参数需要递归函数返回值,来告诉我们是否找到节点q或者p,那么返回值为bool类型就原创 2021-06-21 15:07:47 · 548 阅读 · 0 评论 -
二叉树(十四):二叉搜索树
一、二叉树搜索树理论1、二叉搜索树定义二叉搜索树是一个有序树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉搜索树二叉搜索树主要用于加速查找2、二叉搜索树的遍历理论给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。二叉搜索树由于已经进行了排序,因此我们可以根据当前节点与目标值的大小原创 2021-06-21 10:27:10 · 180 阅读 · 1 评论 -
二叉树(十一):二叉树递归算法中的返回值问题
一、结论对于二叉树的递归算法:如果算法需要遍历整个二叉树,则递归函数不需要返回值如果算法不需要遍历整个二叉树,则递归函数需要有返回值,在找到符合条件的解的是否及时将解返回回去二、例题说明112 路径总和给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。1、解题思路改题目是找到一条路径就可以,因此递归函数需要返回值,返回值应该是一个bool以指示当前是否找到了满足要求的路径对于该题目,我们使用减法来递归,最开始传入目标数targ原创 2021-06-20 22:08:40 · 1467 阅读 · 0 评论 -
二叉树(十):数左下角和右下角的值
513.找树左下角的值给定一个二叉树,在树的最后一行找到最左边的值。一、迭代法1、思路我们可以层次遍历二叉树,记录每一层最左边的值,当遍历结束后,所记录的就是最后一行最左边的值2、代码class Solution {public: int findBottomLeftValue(TreeNode* root) { int res = root->val; queue<TreeNode*> que; que.push(.原创 2021-06-20 20:42:11 · 127 阅读 · 0 评论 -
二叉树(九):左子叶之和
404、左子叶之和一、递归法1、递归思路递归三要素:递归返回值和参数:返回值为当前节点为根节点的子树的左子叶之和,参数为当前节点单层递归逻辑:如果当前根节点具有一个左子叶,则当前节点左子叶之和 = 左子叶的值 + 右子树的左子叶之和如果当前根节点不具有左子叶,则当前节点左子叶之和 = 左子树的左子叶之和 + 右子树的左子叶之和递归终止条件:如果当前节点为空,则返回02、递归代码class Solution {public: //递归函数返回值和参数 int sumOf.原创 2021-06-20 20:23:43 · 537 阅读 · 0 评论 -
二叉树(八):二叉树的全部路径
一、二叉树的全部路径257、二叉树的全部路径给定一个二叉树,返回所有从根节点到叶子节点的路径。1、递归方法获取二叉树的全部路径(推荐)1)递归方法要获取二叉树的全部路径:我们要使用前序遍历,这样才能获取根->孩子节点的访问顺序。同时要使用回溯算法,在访问一个左孩子后回退到根节点再访问由孩子。其算法可视化如图:递归三要素:递归返回值为空,递归参数为当前节点,用于存储当前节点路径的path,用来存放全部路径的res单层递归逻辑:将当前节点添加到当前节点路径中,并继续递归当原创 2021-06-20 16:10:04 · 2049 阅读 · 0 评论 -
二叉树(七):二叉树的高度与平衡二叉树
一、二叉树的深度与高度1、二叉树的深度对于二叉树中的某个节点,其深度是从根节点到该节点的最长简单路径所包含的节点个数,是从上面向下面数的。因此访问某个节点的深度要使用先序遍历2、二叉树的高度对于二叉树中的某个节点其高度是从叶子节点到该节点的最长简单路径包含的节点个数,是从下面向上面数的。因此访问某个节点的高度需要使用后续遍历3、二叉树的深度与高度辨析每层节点的深度和高度如图所示:4、二叉树的深度与高度的联系一个二叉树根节点的高度就是这个二叉树的最大深度二、二叉树的高度1、递归法递归三原创 2021-06-20 15:01:08 · 3766 阅读 · 0 评论 -
二叉树(六):二叉树的最大深度与最小深度
一、二叉树的最大深度二叉树的最大深度二叉树的最大深度可以通过递归法,层次遍历和深度优先遍历实现,但是最简单最容易的就是递归法。1、递归法1)确定递归三要素递归函数的返回值和参数:返回值为当前节点的最大深度,参数为当前节点递归函数的单层逻辑:当前节点的最大深度 = 1 + 左子树或右子树的最大深度递归函数的终止条件:当前节点为空时,当前节点最大深度为02)递归方法代码class Solution {public: //递归参数及返回值 int maxDepth(Tre原创 2021-06-20 12:04:05 · 7538 阅读 · 1 评论 -
二叉树(五):对称二叉树
101.对称二叉树给定一个二叉树,检查它是否是镜像对称的。一、对称二叉树理论对称二叉树如图所示,要判断一个二叉树是否为对称二叉树,实际上就是要判断根节点的左右两个子树是否镜像对称。因此,其解决方案为:按照对称的方式遍历左右子树,比较同时遍历的节点是否一致。而且在遍历过程中,只有两个子树的根节点对称了,继续比较左右子树是否对称才有意义,因此我们使用"中序遍历"(其实不是严格的中序遍历,只是我们先比较根节点)按照遍历依赖的不同,可以分为以下三类方法:递归法基于队列的迭代法基于栈的迭代法.原创 2021-06-19 23:49:00 · 6134 阅读 · 2 评论 -
二叉树(四)、反转二叉树
一、二叉树翻转理论想要翻转二叉树,要进行以下两个步骤:遍历二叉树每一个节点翻转每一个节点的左右孩子节点,没有左右孩子节点的可以视作其左右孩子节点为nullptr二、二叉树翻转代码翻转二叉树1、前序遍历翻转二叉树class Solution {public: TreeNode* invertTree(TreeNode* root) { if (root == NULL) return root; swap(root->left, roo原创 2021-06-19 22:08:46 · 1049 阅读 · 0 评论 -
二叉树(三)、二叉树的层序遍历
一、二叉树层序遍历原理二叉树的层序遍历通过先入先出队列实现,具体方法如下:首先将根节点放入队列然后根节点出队列,并把其左右孩子压入队列然后依次出队列中现有节点,并依次将其左右孩子压入队列重复以上3直到队列为空该算法的时间复杂度:O(n)该算法的空间复杂度:O(n)二、代码实现102、二叉树的层序遍历:给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。class Solution {public: vector<vector原创 2021-06-19 00:34:05 · 1465 阅读 · 2 评论 -
二叉树(二)、二叉树的迭代遍历
递归的本质是将调用函数压入栈中,既然递归可以实现二叉树的遍历,那么迭代也可以实现二叉树的遍历。一、使用迭代实现二叉树遍历的难点我们在访问二叉树的时候,一定是先访问根节点,然后访问两个孩子节点;并且只能通过根访问孩子;不能通过孩子访问根。而三种不同的方法遍历二叉树的差异实际上是什么时候对根结点进行处理(将根节点压入结果中)在二叉树中,每一个节点都可以视作其他节点的根节点,最后一行可以视作两个孩子均为空在递归方法中,我们通过控制递归调用和对节点处理的顺序,可以控制根结点处理的时机。但在循环遍历中,我原创 2021-06-18 20:54:11 · 659 阅读 · 0 评论 -
二叉树(一):二叉树的递归遍历
一、递归算法1、递归三要素确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。原创 2021-06-18 13:46:45 · 355 阅读 · 1 评论 -
二叉树理论
一、满二叉树与完全二叉树在我们解题过程中二叉树有两种主要的形式:满二叉树和完全二叉树。二、二叉搜索数与平衡二叉搜索树1、二叉搜索树二叉搜索树是一种节点值之间具有一定数量级次序的二叉树,对于树中每个节点:若其左子树存在,则其左子树中每个节点的值都不大于该节点值;若其右子树存在,则其右子树中每个节点的值都不小于该节点值。2、平衡二叉搜索树(AVL树)AVL树满足以下要求:左子树与右子树高度之差的绝对值不超过1树的每个左子树和右子树都是AVL树每一个节点都有一个平衡因子(balan原创 2021-06-18 11:41:35 · 188 阅读 · 0 评论