2020.10.05-2020.10.10 leetcode刷题总结(DFS&BFS)

DFS
一.题目列表

1.相同的树
题目描述:
给定两个二叉树,编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例:
输入: 1 1
/ \ /
2 3 2 3

    [1,2,3],   [1,2,3]

输出: true

题解:
递归

2.二叉树的最大深度
题目描述:
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。

示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/
9 20
/
15 7

题解:
若空则返回0,否则返回最大值+1

3.路径总和 II
题目描述:
给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。

示例:
给定如下二叉树,以及目标和 sum = 22,
5
/
4 8
/ /
11 13 4
/ \ /
7 2 5 1
返回:
[
[5,4,11,2],
[5,8,4,5]
]

题解:
定义一个链表存储节点值,对root和sum进行深度优先遍历。

4.路径总和
题目描述:
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。

示例:
给定如下二叉树,以及目标和 sum = 22,

          5
         / \
        4   8
       /   / \
      11  13  4
     /  \      \
    7    2      1

返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。

题解:
若root为空返回false,若左右子树不为空且sum=root.val返回true,做左子树不为空递归,右子树不为空递归,左右子树都不为空,递归 ||

5.从中序与后序遍历序列构造二叉树
题目描述:
根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。

示例:
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
3
/
9 20
/
15 7

题解:
先定义一个hashmap,找到每个值在中序遍历的位置,定义一个类进行构造,先从后序序列中找到根节点,节点的右子树递归构造,左子树递归构造。最后返回根节点。

6.从前序与中序遍历序列构造二叉树
题目描述:
根据一棵树的前序遍历与中序遍历构造二叉树。

示例:
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/
9 20
/
15 7

题解:
先定义一个hashmap,找到每个值在中序遍历的位置,定义一个类进行构造,先从前序序列中找到根节点,节点的左子树递归构造,右子树递归构造。最后返回根节点。

7.平衡二叉树
题目描述:
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。

示例:
给定二叉树 [3,9,20,null,null,15,7]
3
/
9 20
/
15 7
返回 true 。

题解:

8.求根到叶子节点数字之和
题目描述:
给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。
例如,从根到叶子节点路径 1->2->3 代表数字 123。
计算从根到叶子节点生成的所有数字之和。

示例:
输入: [1,2,3]
1
/
2 3
输出: 25
解释:
从根到叶子节点路径 1->2 代表数字 12.
从根到叶子节点路径 1->3 代表数字 13.
因此,数字总和 = 12 + 13 = 25.

题解:
定义dfs和sum,若为空则返回0,sum=sum*10+root.val 否则返回左右子树的dfs之和

9.二叉树中的最大路径和
题目描述:
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。

示例:
输入:[1,2,3]
1
/
2 3
输出:6

题解:
分别求左右子树的gain,maxsum=之前的maxsum和现在的取最大值,气质maxsum定义为全局变量,最后返回该值

二.相关语法及用法

BFD
一.题目列表
1.对称二叉树
题目描述:
给定一个二叉树,检查它是否是镜像对称的。

示例:
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/
2 2
/ \ /
3 4 4 3

题解:
check函数传入两个节点,左右子树分别判断。

2.二叉树的最小深度
题目描述:
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回它的最小深度 2.

题解:

3.二叉树的层序遍历
题目描述:
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。

示例:
二叉树:[3,9,20,null,null,15,7],
3
/
9 20
/
15 7
[
[3],
[9,20],
[15,7]
]

题解:

  1. 二叉树的堂兄弟节点
    题目描述:
    在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。
    如果二叉树的两个节点深度相同,但父节点不同,则它们是一对堂兄弟节点。
    我们给出了具有唯一值的二叉树的根节点 root,以及树中两个不同节点的值 x 和 y。
    只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true。否则,返回 false。

示例:
输入:root = [1,2,3,4], x = 4, y = 3
输出:false

题解:
定义一个父节点,每次在同一层中遍历,若值相等判断父节点,若一个找到一个没找到,不是,都没找到,不做返回

5.N叉树的层序遍历
题目描述:
给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。

示例:
例如,给定一个 3叉树 :
返回其层序遍历:
[
[1],
[3,2,4],
[5,6]
]

题解:

6.二叉树中所有距离为 K 的结点
题目描述:
给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 K 。
返回到目标结点 target 距离为 K 的所有结点的值的列表。 答案可以以任何顺序返回。

示例:
输入:root = [3,5,1,6,2,0,8,null,null,7,4], target = 5, K = 2
输出:[7,4,1]
解释:
所求结点为与目标结点(值为 5)距离为 2 的结点,
值分别为 7,4,以及 1

题解:
先dfs存储父节点,然后寻找,若不包含重复的则加入set,如果K=0,则加入该点,否则递归子树和父节点,k-1

7.二叉树的层次遍历 II
题目描述:
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回其自底向上的层次遍历为:
[
[15,7],
[9,20],
[3]
]

题解:
levelOrder.add(0, level);在指定位置插入

8.找树左下角的值
题目描述:
给定一个二叉树,在树的最后一行找到最左边的值。

示例:
输入:
2
/
1 3

输出:
1

题解:
从右到左层序遍历,返回targrt

9.特定深度节点链表
题目描述:
给定一棵二叉树,设计一个算法,创建含有某一深度上所有节点的链表(比如,若一棵树的深度为 D,则会创建出 D 个链表)。返回一个包含所有深度的链表的数组。

示例:
输入:[1,2,3,4,5,null,7,8]
1
/ \
2 3
/ \ \
4 5 7
/
8
输出:[[1],[2,3],[4,5,7],[8]]

题解:
定义一个dummy为头节点,cur.next=poll(),每层结束后res.add(dummy.next),dummy.next==null最后return res.toArray(new ListNode[] {});将列表转换为集合

二.相关语法及用法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 好的,我来用中文回复这个链接:https://leetcode-cn.com/tag/dynamic-programming/ 这个链接是 LeetCode 上关于动态规划的目集合。动态规划是一种常用的算法思想,可以用来解决很多实际问,比如最长公共子序列、背包问、最短路径等等。在 LeetCode 上,动态规划也是一个非常重要的型,很多目都需要用到动态规划的思想来解决。 这个链接里包含了很多关于动态规划的目,按照难度从简单到困难排列。每个目都有详细的目描述、输入输出样例、目解析和代码实现等内容,非常适合想要学习动态规划算法的人来练习和提高自己的能力。 总之,这个链接是一个非常好的学习动态规划算法的资源,建议大家多多利用。 ### 回答2: 动态规划是一种算法思想,通常用于优化具有重叠子问和最优子结构性质的问。由于其成熟的数学理论和强大的实用效果,动态规划在计算机科学、数学、经济学、管理学等领域均有重要应用。 在计算机科学领域,动态规划常用于解决最优化问,如背包问、图像处理、语音识别、自然语言处理等。同时,在计算机网络和分布式系统中,动态规划也广泛应用于各种优化算法中,如链路优化、路由算法、网络流量控制等。 对于算法领域的程序员而言,动态规划是一种必要的技能和知识点。在LeetCode这样的程序员平台上,目分类和标签设置十分细致和方便,方便程序员查找并深入学习不同类型的算法。 LeetCode的动态规划标签下的目涵盖了各种难度级别和场景的问。从简单的斐波那契数列、迷宫问到可以用于实际应用的背包问、最长公共子序列等,难度不断递进且话丰富,有助于开发人员掌握动态规划的实际应用技能和抽象思维模式。 因此,深入LeetCode动态规划分类下的目学习和练习,对于程序员的职业发展和技能提升有着重要的意义。 ### 回答3: 动态规划是一种常见的算法思想,它通过将问拆分成子问的方式进行求解。在LeetCode中,动态规划标签涵盖了众多经典和优美的算法问,例如斐波那契数列、矩阵链乘法、背包问等。 动态规划的核心思想是“记忆化搜索”,即将中间状态保存下来,避免重复计算。通常情况下,我们会使用一张二维表来记录状态转移过程中的中间值,例如动态规划求解斐波那契数列问时,就可以定义一个二维数组f[i][j],代表第i项斐波那契数列中,第j个元素的值。 在LeetCode中,动态规划标签下有众多难度不同的问。例如,经典的“爬楼梯”问,要求我们计算到n级楼梯的方案数。这个问的解法非常简单,只需要维护一个长度为n的数组,记录到达每一级楼梯的方案数即可。类似的问还有“零钱兑换”、“乘积最大子数组”、“通配符匹配”等,它们都采用了类似的动态规划思想,通过拆分问、保存中间状态来求解问。 需要注意的是,动态规划算法并不是万能的,它虽然可以处理众多经典问,但在某些场景下并不适用。例如,某些问的状态转移过程比较复杂,或者状态转移方程中存在多个参数,这些情况下使用动态规划算法可能会变得比较麻烦。此外,动态规划算法也存在一些常见误区,例如错用贪心思想、未考虑边界情况等。 总之,掌握动态规划算法对于LeetCode的学习和解都非常重要。除了以外,我们还可以通过阅读经典的动态规划书籍,例如《算法竞赛进阶指南》、《算法与数据结构基础》等,来深入理解这种算法思想。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值