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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值