搜索-dfs
搜索-dfs
tzyshiwolaogongya
这个作者很懒,什么都没留下…
展开
-
leetcode687——Longest Univalue Path
题目大意:求二叉树中每个节点值都相同的最长路径长度,长度=节点间边数。分析:dfs。维护全局maxLen,对每个节点求最长路径。经过该节点的最长路径=leftLen+rightLen。LeftGain、RightGain分别为左右子节点的最大贡献值。节点最大贡献值=节点值+max(leftGain,rightGain),因为贡献值代表该节点左侧路径or右侧路径二选一,选择一条贡献值最大的继续往该节点的父节点贡献。代码:/** * Definition for a binary tree no原创 2020-07-02 11:28:35 · 142 阅读 · 0 评论 -
leetcode124——Binary Tree Maximum Path Sum
题目大意:求二叉树中最大路径和,路径可以从任意任意节点出发,到任意节点结束。分析:dfs。维护全局maxSum,对每个节点求最大路径。经过该节点的最大路径=节点值+leftGain+rightGain。LeftGain、RightGain分别为左右子节点的最大贡献值。节点最大贡献值=节点值+max(leftGain,rightGain),因为贡献值代表该节点左侧路径or右侧路径二选一,选择一条贡献值最大的继续往该节点的父节点贡献。代码:/** * Definition for a binar原创 2020-07-01 16:57:10 · 144 阅读 · 0 评论 -
leetcode617——Merge Two Binary Trees
题目大意:合并两棵二叉树变成一棵树,合并时重叠的两节点值相加作为新节点,否则不为NULL的节点作为新节点分析:dfs。先合并当前节点:有一方为空就直接返回另一方(这个分支无需再合并了),两节点都存在就值相加。然后递归合并左右子树即可。代码:/** * Definition for a binary tree node. * struct TreeNode { * int...原创 2020-04-04 09:59:05 · 116 阅读 · 0 评论 -
leetcode538/1038——Convert Bst to Greater Tree/Binary Search Tree to Greater Sum Tree
题目大意:把二叉搜索树转化成累加树,使得每个节点的值是原来的节点值加上所有大于它的节点值之和分析:题意转化成=>从右往左中序遍历,并且在遍历过程中记录前一个访问节点的值代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; ...原创 2020-04-01 11:35:43 · 126 阅读 · 0 评论 -
leetcode437——Path SumⅢ
题目大意:找出二叉树中路径和等于目标和的路径个数,节点为整数(可能为负),路径起点不一定为根节点,但是方向向下分析:二叉树dfs。相比leetcode112、113要注意两点:节点数值可能为负,路径起点可以任选。因为路径起点任选,所以要以树中每一个节点为起点dfs,也就是用countHelper统计以该点为起点的路径条数,然后递归统计左右节点为起点的路径条数。countHelper统计...原创 2020-03-26 10:48:26 · 102 阅读 · 0 评论 -
poj2531——Network Saboteur
题目大意:n个结点,把他们分成A、B两组,给出结点间距离数组Cij,问∑Cij(i∈A,j∈B)的最大值输入:n(2 <= N <= 20) Cij矩阵(每个数字中间以空格分隔)(0 <= Cij <= 10000)输出:∑Cij最大值分析:dfs搜索 先将所有节点标为0,即都在一个集合中,然后依次取出一个结点标...原创 2017-11-17 21:25:53 · 251 阅读 · 0 评论 -
poj1186——方程的解数
题目大意:,1 <= xi <= M, i=1...n(1 <= n <= 6;1 <= M <= 150)输入:n M ki pi(共n行)输出:整数解的个数分析:折半搜索+哈希。暴力枚举超时,所以将方程分成两半,先枚举前一半的解,将总值哈希存储,然后枚举后一半看看是否和左值相等,若是则是一个解。...原创 2017-12-05 10:43:08 · 315 阅读 · 0 评论 -
leetcode87——Scramble String
题目大意:将字符串作为根结点进行拆分,使其分成两半各为一个子节点,这两个子节点继续同上拆分,最后形成一颗字符树,交换树中的某些子节点后形成的字符串被称为根节点的搅乱字符串。问给出的字符串2是否是字符串1的搅乱字符串?分析:递归dfs或者dp。 递归剪枝:两个字符串长度不等返回false;两个字符串所含字符不同返回false 递归过程:将字符串2从每个...原创 2018-06-04 17:23:52 · 154 阅读 · 0 评论 -
leetcode802——Find Eventual Safe States
题目大意:从一个结点出发,最终能走到一个没有出边的点,那么这个起始点称为安全点。给出有向图的邻接表,问图里哪些点是安全点。分析:dfs。这道题的意思就是看从哪些点出发没有能回到原点的环存在。给图中的结点上色,初始化为0号色,然后dfs时将起始点染1号色(成环的点),安全点染2号色。代码:class Solution {public: vector<int>...原创 2018-03-22 14:37:50 · 782 阅读 · 0 评论 -
leetcode37——Sudoku Solver
题目大意:填写数独分析:dfs。注意得到第一个解就要及时返回,否则就会出错。代码:class Solution {public: void solveSudoku(vector<vector<char>>& board) { solve(board); } bool solve(vector<vector...原创 2018-04-16 17:36:04 · 255 阅读 · 0 评论 -
leetcode543——Diameter of Binary Tree
题目大意:求二叉树直径(两个叶节点的最大距离)分析:遍历每个根节点,找到左右子树深度之和的最大值代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(...原创 2019-11-05 11:28:06 · 111 阅读 · 0 评论 -
leetcode129——Sum Root to Leaf Numbers
题目:每个节点存放一个0-9的数字,每条从根到叶子节点的路径都代表一个数字,求根到叶子节点生成的所有数字之和。代码:以下两种方式都行/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * ...原创 2020-02-19 10:48:36 · 120 阅读 · 0 评论 -
leetcode113——Path SumⅡ
题目大意:找到所有从根节点到叶子节点路径总和等于给定目标和的路径。代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), ...原创 2020-02-09 11:41:04 · 124 阅读 · 0 评论 -
leetcode112——Path Sum
题目大意:判断二叉树是否存在一条路径和等于目标和的路径代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(N...原创 2020-01-15 20:41:14 · 116 阅读 · 0 评论 -
leetcode111——Minimum Depth of Binary Tree
题目大意:求二叉树的最小深度,即根到最近叶节点的深度分析:dfs、bfs均可代码:自己的代码:bfs/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x...原创 2018-03-10 22:00:28 · 168 阅读 · 0 评论 -
leetcode110——Balanced Binary Tree
题目大意:判断二叉树是否是AVL分析:dfs整棵树判断每个结点的左右子树高度差是否大于1代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int ...原创 2019-10-30 21:32:24 · 114 阅读 · 0 评论 -
leetcode106——Construct Binary Tree from Inorder and Postorder Traversal
题目大意:根据给出的中序和后序遍历的序列构建二叉树分析:dfs。与上一题105同理递归求解代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int...原创 2018-07-24 19:13:54 · 130 阅读 · 0 评论 -
leetcode105——Construct Binary Tree from Preorder and Inorder Traversal
题目大意:根据所给的前序和中序遍历的二叉树序列构建出二叉树分析:dfs。由于前序遍历时的第一个结点就是根节点,在中序遍历的序列中位于根节点左侧的就是左子树,右侧的就是右子树,所以可以递归建树代码:/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; ...原创 2018-07-24 18:48:48 · 112 阅读 · 0 评论 -
leetcode236——Lowest Common Ancestor of a Binary Tree
题目大意:在二叉树中找两个节点的最近祖先节点分析:两个节点A、B的最近祖先节点特征:要么是自身,要么是左右子树分别存在A、B。因此,从根节点开始遍历二叉树,当前节点为空或为AB节点时返回;当前节点的左子树存在A,右子树存在B,则它就是答案;当前节点的左子树不存在AB,继续遍历右子树;当前节点的右子树不存在AB,继续遍历左子树。代码:TreeNode* lowestCommonAnce...原创 2019-10-24 15:39:38 · 136 阅读 · 0 评论 -
leetcode235——Lowest Common Ancestor of a Binary Search Tree
题目大意:在二叉搜索树中找出两节点的最近祖先节点分析:首先明确概念,只要B节点位于A节点的子树中,A即为B的祖先节点(自己也是自己的祖先节点);“最近”是指两节点的祖先节点中深度最大的一个。两节点的最近祖先节点特征:值位于两节点之间(包含端点值)。因此从根节点递归遍历,当前节点大于两节点时,继续遍历左子树;当前节点小于两节点时,继续遍历右子树。代码:struct TreeNode {...原创 2019-10-24 14:58:36 · 161 阅读 · 0 评论 -
leetcode108——Convert Sorted Array to Binary Search Tree
题目大意:给出升序数组,根据数组构建平衡二叉搜索树分析:dfs。由于数组是升序的,所以每次找到中间节点即为根节点,左侧就是二叉树的左子树,右侧就是二叉树的右子树,递归建树即可。有点类似二分法的感觉。由于每次都是平均分配,所以是平衡树。代码:/** * Definition for a binary tree node. * struct TreeNode { * int...原创 2018-07-24 22:22:28 · 109 阅读 · 0 评论 -
leecode98——Validate Binary Search Tree
题目大意:判断一棵树是否是二叉搜索树分析:dfs。二叉搜索树需要满足一个结点的左子树中的所有点都比他小,右子树中的所有点都比他大,并且它的左右子树也分别都是二叉搜索树。所以递归就需要两步,一是一直找到根节点左子树中的最大(最右)节点,并且判断根与最右结点&&根的左子树是不是二叉搜索树;二是一直找到根节点右子树中的最小(最左)结点,并且判断根与最左结点&&根的右子...原创 2018-06-25 07:52:22 · 125 阅读 · 0 评论 -
leetcode501——Find Mode in Binary Search Tree
题目大意:给出的二叉搜索树是含有重复结点的,找出树中出现最频繁的数字,如果有多个出现次数都为最大值的顺序无所谓分析:dfs。由于二叉搜索树的特点,中序遍历就会得到非降序序列,相同节点是连续的,所以只需要中序遍历二叉搜索树并不断记录每个数字的出现次数,更新最大频率数字即可。代码:转载自https://blog.csdn.net/liuchuo/article/details/54854037clas...原创 2018-06-27 08:17:15 · 150 阅读 · 0 评论 -
leetcode99——Recover Binary Search Tree
题目大意:一个二叉树搜索树中的有两个节点放错了位置,请将树恢复分析:dfs。二叉搜索树满足中序遍历得到升序序列,如果有节点放反了就会出现逆序情况,例如原序列123456,如果2、5反了就是153426,出现两个逆序对,我们要找到交换的两个节点即为第一个逆序对的第一个结点和第二个逆序对的第二个节点。所以dfs遍历时我们用pre指针维护当前节点的前一个结点,然后比较他们的值即可,如果出现逆序就记录...原创 2018-06-26 07:54:49 · 157 阅读 · 0 评论 -
leetcode329——Longest Increasing Path in a Matrix
题目大意:给出一个矩阵,在这个矩阵中找出最长的一条路径,路径中的数字按从小到大升序。分析:拓扑排序或者dfs+dp。 拓扑排序的思路:将矩阵中每个数字表上序号,从每个结点出发向它上下左右比它大的结点画线,建好图后拓扑排序找顺序即可。 dfs思路:dfs搜索四个方向,dp记忆化提高效率,就是说已经记录过步长的位置就没必要再次搜索了。代码:dfs转载...原创 2018-03-21 15:16:17 · 187 阅读 · 0 评论 -
leetcode79——Word Search
题目大意:在二维矩阵中找字符串是否存在,搜索时字符串中的相邻字符在二维矩阵中也必须相邻(上下左右相邻)分析:回溯法。递归查找二维数组的每个位置,找到了直接返回true。注意dfs的终止条件和dfs的能动条件。代码:class Solution {public: int dx[4] = { -1,1,0,0 }; int dy[4] = { 0,0,-1,1 }; bool exist(vector...原创 2018-05-25 14:27:24 · 150 阅读 · 0 评论 -
leetcode200——Number of Islands
题目大意:给出二维地图,1代表陆地,0代表水,上下左右相邻的陆地算一个岛,判断岛屿的数量。分析:并查集或dfs均可。dfs的思路就是遍历二维数组,每次遇到一个为1的陆地,就代表多了一个岛屿,并dfs将与它相连的所有陆地都变为0。代码:法一:并查集转载自http://blog.csdn.net/jmspan/article/details/51311628publicclass...原创 2018-03-16 20:30:41 · 182 阅读 · 0 评论 -
poj3009——Curling 2.0
题目大意:在有一些障碍的球场打冰球,只能向前后左右扔(不能扔对角线),球会一直按所扔方向走直到撞墙,撞墙时球停在墙的前一个格子处,并且墙消失,问最少需要扔多少次能让球从起始S走到目标G,次数不能超过10次,否则失败输入:(可以有不超过100个的case,一个case即一个数据集,输入以0 0结束) 第i个case的球场宽度w 高度h(2 <=w<=...原创 2017-11-15 14:25:33 · 262 阅读 · 1 评论 -
poj3620——Avoid The Lakes
题目大意:给出N*M的田地,其中有K块被水淹没,求出淹没的最大连通面积输入:N M K(1 ≤N≤ 100)(1 ≤M≤ 100) 第i块被淹没的行R 列C(共K行)输出:最大连通面积分析:和leetcode200类似。dfs从每一个水田开始,找最大连通分量代码:#include<cstdio>#include<cstrin...原创 2018-01-20 12:20:10 · 270 阅读 · 0 评论 -
poj2488——A Knight's Journey
题目大意:国际象棋的棋盘行为数字(1、2、3...),列为字母(A、B、C...),骑士按照国际象棋马的规则走(走一步意味着在一个方向上跳两格,再在垂直方向上跳一格),问骑士能不能每个格子遍历一次走完整个棋盘,如果有多种路径解法,按字典序最小的输路径,如果无解,则打印impossible输入:case个数n 第i个棋盘的行数p 列数q(1<=p*q <= 2...原创 2017-11-14 22:20:40 · 240 阅读 · 0 评论