
树
树
happy19991001
笨鸟先飞
展开
-
二叉树中的伪回文路径(DFS+简单回溯)
二叉树中的伪回文路径(DFS+简单回溯)问题:思路:若一条路径中有大于1个数出现了奇数次,则不能构成回文串采用一个数组作为计数器,记录每个数出现的次数构造函数check判断计数器中的记录是否能构成回文串进行dfs遍历,当一个新节点放入栈顶(进入新的递归层),更新该节点值的计数器,若该节点为叶子节点,检查计数器,若满足条件,则满足条件路径数+1。之后对左右子树调用dfs函数,调用完成后该节点值在计数器中的数目-1( 节点退栈,进行回溯 )代码:/** * Definition for原创 2020-08-03 22:27:20 · 236 阅读 · 0 评论 -
收集树上所有苹果的最小时间
收集树上所有苹果的最小时间问题:思路:从苹果节点不断向父节点的方向走需要解决的是:1.得到每个节点的父节点2.防止在向父节点走时重复计算首先由题设输入构造邻接表,已知节点0是根节点,由此可通过dfs得到所有节点的根节点,保存在vector中构建dfs函数,由于邻接表为无向图的邻接表,为防止两节点互相认作父节点,参数中需包含上次遍历的根节点,dfs函数中的邻接表参数注意得是传引用,若是传值调用,每次调用都会发生拷贝构造,会导致超时为防止在向父节点走时重复计算,使用visited数组保存原创 2020-08-03 17:07:26 · 185 阅读 · 0 评论 -
在二叉树中分配硬币(后序遍历)
在二叉树中分配硬币(后序遍历)问题:思路:每次转移操作要么是父节点向左右孩子节点转移,要么是左右孩子节点向父节点输送递归函数的返回值表示节点多出或需要的硬币数,在转移操作之前,节点本身多出或需要的硬币数root_need为1-root->val(为负表示多出的硬币数),但需考虑左右孩子节点的情况对左右孩子节点递归调用递归函数得到左右孩子多出或需要的硬币数,若多出,左右孩子将多出硬币给根节点,若需要,根节点将硬币给左右孩子,因此所需移动的次数ans+=abs( left_need )+a原创 2020-08-03 15:17:11 · 343 阅读 · 0 评论 -
层数最深叶子节点的和(BFS)
层数最深叶子节点的和(BFS)问题:思路:不能先计算树的高度,会超时,对每层叶子节点和做记录即可代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */cl原创 2020-08-01 17:28:44 · 420 阅读 · 0 评论 -
好叶子节点对的数量(后序遍历DFS)
好叶子节点对的数量(后序遍历DFS)问题:思路:我们需要知道节点的叶子节点到节点的距离,从中选取满足条件的叶节点对通过后序遍历DFS分别构造节点的叶子节点到节点的左孩子的距离以及节点的叶子节点到节点的右孩子距离,通过这两个距离构造节点的叶子节点到节点的距离DFS的返回值为vector< int >,表示节点的叶节点到节点的距离,通过DFS,我们可以知道叶节点到节点的左孩子的距离以及到节点的右孩子的距离,这两个距离+1即为叶节点到节点的距离,若有满足条件的距离,将此距离加入到保存叶原创 2020-08-01 10:34:54 · 220 阅读 · 0 评论 -
二叉树中所有距离为K的节点(DFS+BFS)
二叉树中所有距离为K的节点(DFS+BFS)问题:思路:为找到与节点距离为K的节点,需解决节点回溯到其父节点的问题,因此需知道每个节点的父节点,使用哈希表进行保存,通过DFS建立此哈希表将target节点push到队列中,进行三个方向的BFS(左孩子、右孩子、父节点),为防止重复访问节点,需使用set保存已访问过的节点代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; *原创 2020-08-01 09:17:47 · 676 阅读 · 0 评论 -
树形DP or 单调栈贪心:叶值的最小代价生成树
树形DP or 单调栈贪心:叶值的最小代价生成树问题:思路:树形DP:对于题中所给数组,由于数组中的值与中序遍历中叶节点的值对应,则可将数组分为两部分,左部分为左子树叶节点,右部分为右子树叶节点,则根节点的值即为左右两部分数组中最大值的乘积,树中非叶节点和即为根节点的值+左子树非叶节点和+右子树非叶节点和,由于数组的划分是不确定的,因此需找到使得非叶节点和最小的划分设DP[i][j]表示在原数组中左右界分别为i,j的数组得到的树的最小非叶节点和M[i][j]表示在原数组中左右界分别为i,j的原创 2020-08-01 07:55:20 · 189 阅读 · 0 评论 -
树形DP:打家劫舍3
树形DP:打家劫舍3问题:思路:每个节点有选和不选两种状态,若选,则其孩子节点不可选,若该节点不选,则孩子节点可选也可不选设DP[u][0]表示不选当前结点u的情况下以u为根的子树所能得到得最大价值DP[u][1]表示选当前结点u的情况下以u为根的子树所能得到得最大价值设v为其孩子节点使用pair保存选或不选两种情况的值,通过DFS求解代码:class Solution {public: pair<int, int> dfs(TreeNode *root) {原创 2020-07-31 08:24:15 · 225 阅读 · 1 评论 -
二叉树最大宽度(节点编号+BFS)
二叉树最大宽度(节点编号+BFS)问题:思路:需对节点编号,每层最后一个节点编号-第一个节点编号+1即为该层宽度对于满二叉树,若根的编号为x,则其左孩子编号为2x,右孩子编号为2x+1BFS所使用的队列需保存节点指针及节点的编号为防止数据超过表示范围,需使用unsigned long long,当队列中只有一个元素,即该层只有一个节点时,可将其编号修正为1,以减少溢出可能代码:/** * Definition for a binary tree node. * struct Tre原创 2020-07-30 16:41:50 · 463 阅读 · 1 评论 -
二叉树中的列表(双递归)
二叉树中的列表(双递归)问题:思路:设计一判断匹配的递归函数,其功能为判断以当前节点为起点往下的路径是否有与链表相匹配的,有四种情况:1.当前链表节点为空,说明匹配成功,返回TRUE2.当前树中节点为空,匹配失败,返回FALSE3.树中节点值不等于链表中节点,返回FALSE4.若不是上述三种情况,则成功匹配了一部分链表节点,继续在根的左子树以及右子树(若左子树中不能匹配,则还需在右子树中进行匹配)中调用递归函数进行判断接下来只需从根节点开始逐个调用匹配函数进行判断即可,因此设计一前序遍原创 2020-07-30 09:28:15 · 317 阅读 · 0 评论 -
寻找重复的子树(序列化+哈希表)
寻找重复的子树(序列化+哈希表)问题:思路:若两个子树是重复的,则它们的先序遍历序列相同,用哈希表记录遍历序列,若当前遍历序列已在哈希表中,则将当前节点作为重复子树的根节点保存在列表中代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0),原创 2020-07-30 08:49:04 · 244 阅读 · 0 评论 -
由遍历序列构造二叉树or二叉搜索树+由连续数构造二叉搜索树
由遍历序列构造二叉树or二叉搜索树目录由遍历序列构造二叉树or二叉搜索树由先序与中序遍历序列构造二叉树递归算法:非递归算法:由中序与后序序列构造二叉树由前序与后序序列构造二叉树由前序序列构建二叉搜索树由遍历序列构造二叉树或二叉搜索树可用递归方式求解,也可用非递归方式递归方式的关键是定位根的左子树遍历序列与右子树遍历序列由先序与中序遍历序列构造二叉树问题:递归算法:递归函数的作用是根据先序与中序遍历序列创建二叉树,问题的关键在于定位根的左子树序列与右子树序列,分别对其调用递归函数,得到根的左子原创 2020-07-29 16:53:00 · 832 阅读 · 0 评论 -
非递归遍历二叉树
非递归遍历二叉树需按照递归遍历的思想,将递归算法转换为非递归算法经典算法:递归时的函数调用,在非递归时即为参数压栈,递归时的调用函数返回,在非递归时即为栈顶元素出栈,在非递归中设遍历指针p,指向当前遍历的节点,在递归时即为指示当前递归调用函数的参数的指针中序遍历的访问过程:思路:在递归遍历时,若递归函数为f,则执行顺序为f(left),root,f(right)转化为非递归:1.沿着根的左孩子,依次入栈,直到左孩子为空,说明已找到可以输出的节点2.栈顶元素出栈并访问,若该节点右孩子为空,则原创 2020-07-24 09:21:50 · 157 阅读 · 0 评论 -
前缀树(字典树)Trie Tree
前缀树(字典树)Trie Tree前缀树含义Trie树,即前缀树,又称单词查找树或字典树,是一种树形结构。该树典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。应用题目:给你100000个长度不超过10的单词。对于每一个单词,我们要判断他出没出现过,如果出现了,求第一次出现在第几个位置。在Trie树适用的状态下,很多情况同样可以使用hash树。但是Trie树用途更加的广泛,比如给一个字符串,要寻找有多少单词是以该字符串为前缀的问题。代码解析Tr转载 2020-05-13 21:24:24 · 453 阅读 · 0 评论 -
将有序数组转化为平衡的二叉搜索树
将有序数组转化为平衡的二叉搜索树问题:思路:分治递归:若树是平衡的二叉搜索树,则根的左右子树均为平衡的二叉搜索树递归函数的功能为生成以有序数组中间元素为根的平衡二叉搜索树(参数为有序数组,返回根节点),则中间元素左侧的元素将生成根的左子树(也为平衡二叉搜索树),中间元素右侧的元素将生成根的右子树(也为平衡二叉搜索树),由于左右元素总数之差不大于1,整个树此时为平衡二叉搜索树(若数组元素...原创 2020-05-06 20:10:53 · 392 阅读 · 0 评论 -
修剪二叉搜索树
修剪二叉搜索树问题:思路:分治递归:递归函数的功能是使以当前节点为根的树修剪完毕且返回处理完成后的树根节点当根节点的值小于下界时,根节点以及其左子树应全部丢弃,此时返回对根节点的右孩子递归调用函数的返回值。当根节点的值大于上界时,根节点以及其右子树应全部丢弃,此时返回对根节点的左孩子递归调用函数的返回值。若根节点的值处于下界与上界之间,分别对根节点的左右子树进行递归函数调用,其返回...原创 2020-05-05 20:59:18 · 141 阅读 · 0 评论 -
二叉树的最近公共祖先
二叉树的最近公共祖先问题:思路:分治递归:在二叉树中寻找节点p,q:要么p或q为根节点,在这种情况下,根节点即为最近公共祖先。要么p,q 分布在左子树或右子树中。若p,q分别分布在左右子树,根节点即为最近公共祖先,若p,q都处于左子树或右子树中,则处理对象变为根的左子树或右子树,对左子树或右子树递归求解。递归函数的功能为寻找节点p,q的最近公共祖先,若根节点即为p或q,直接返回根节点...原创 2020-05-04 17:17:02 · 164 阅读 · 0 评论 -
二叉树之最长同值路径
二叉树之最长同值路径问题:思路:后序遍历 + 递归:定义变量ans保存最长同值路径长度,初始为0递归函数的功能为计算从p节点开始,向下出发最长的同值路径长度,递归函数的参数包含引用变量参数ans先对p节点的左右子树根调用递归函数,得到从左右子树根出发的最长同值路径长度分别为left,right若左右子树根的值与p节点的值相同,对应的最长同值路径长度 left 或 right 需加...原创 2020-05-04 11:22:07 · 336 阅读 · 0 评论 -
Leetcode 437: 二叉树路径总和3(双递归)
Leetcode 437: 二叉树路径总和3问题:此题的测试用例表示单节点也算作一条路径,但是在题中并没有说明,这显然是不符合路径定义的原创 2020-05-04 08:57:43 · 318 阅读 · 0 评论 -
二叉树的坡度
二叉树的坡度原创 2020-05-02 08:19:21 · 197 阅读 · 0 评论 -
二叉树的所有路径
二叉树的所有路径原创 2020-05-01 15:59:04 · 1116 阅读 · 0 评论 -
翻转二叉树
翻转二叉树问题:思路:1.层次遍历(迭代)利用队列遍历,利用STL中的Swap函数将出队的树节点的指向左右子树根节点的指针交换,并将指向左右子树根节点的指针入队遍历开始前将根节点入队,遍历结束条件为队列为空2.分治递归将一颗树翻转,即将其左右子树交换,再将左右子树翻转当树为空时,递归函数直接返回代码:层次遍历(迭代):/** * Definition for a bina...原创 2020-04-30 15:38:05 · 293 阅读 · 0 评论 -
对称二叉树
对称二叉树问题:思路:分治递归:一颗二叉树为对称二叉树,需满足其左右子树对称。而两棵二叉树对称需满足根节点的值相等,且每个树的左子树都与另一个数的右子树对称。代码:分治递归:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; *...原创 2020-04-30 10:31:21 · 279 阅读 · 0 评论 -
Leetcode107:二叉树的层次遍历2
Leetcode107:二叉树的层次遍历2题目:思路:按层次遍历树后将二维vector按逆序输出迭代:需使用queue模板类建立队列q,元素类型为指向树节点的指针。每次循环用一个一维vector存储一层树节点的值,通过出队列遍历并存储一层树节点,同时将它们的左右孩子入队。当q空时,遍历完毕退出。先将树的根节点指针root入队,在进行遍历一层树节点前先创建一个一维vector用于存储一...原创 2020-04-29 19:45:50 · 157 阅读 · 0 评论