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]
]
题解:
- 二叉树的堂兄弟节点
题目描述:
在二叉树中,根节点位于深度 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[] {});将列表转换为集合
二.相关语法及用法