本人从接触算法至此的第一个大难题:DFS+回溯+动态规划、很多题都是一知半解,简单总结就是:讲题一听就懂,答案一看就会,自己写一瞅就懵。被树折磨到半夜做梦都是二叉上挂着水果,痛定思痛,潜心修炼。今天是暴打二叉树的第一天:先从二叉树的递归开始。
我对递归的理解是:重中之重!!!!!
不单单是树图这些结构,很多算法思想也用到了递归。由于我以为我在本科阶段深深的理解到了递归的本质,(此处大笑三声)直到被leetcode的树、图、回溯、分治、动态规划暴打才让我如梦初醒。(意思就是一题不会,尬笑)
今天也就是Today,lz要狠狠的啃下这块硬骨头~的同时,分享一下学习经过,也希望诸位能给些建议和指导,我让我室友给诸位看官磕一个。
开始:先从DFS开始:
先偷个模板DFS的模板:
DFS算法题的应用场景:
1、二叉树有关问题
2、需要从根节点遍历到末尾叶子节点
3、(最大、最小)的深度、路径、节点...等等等等
DFS的思路:
1、创建储存变量初始化当前结果
2、设计递归函数
函数执行过程:
1、到达结尾,返回
2、未到达结尾,更新当前结果
上上上模板!!
func dfsTemelate(root *TreeNode) int{
//来个存储当前结构的变量
res := math.MinInt32 //这个看题目定义
//再来个初始化当前结果变量
start := 0 //这个也自己定义
//给lz开始递归
dfs(root,start)
return res
}
func dfs(node *TreeNode, current int) {
//终止条件返回判断
if (node == nil){
return
}
//更新当前结果currentResult
//若到达末尾叶子结点,进行最优结果更新
if node.Left == nil && node.Right == nil{
//update res
}
//左右递归
dfs(node.Left, current)
dfs(node.Right, current)
}
上上上练习!!!!!!!
func maxDepth(root *TreeNode) (res int) {
//同样的来个存储结果的值
//再来个初始的值
start := 0
var dfs func(*TreeNode, int)
dfs = func(Node *TreeNode, deep int) {
//是不是终止条件
if Node == nil {
return
}
//更新当前的deep
deep++
if Node.Left == nil && Node.Right == nil {
if deep >= res {
res = deep
}
}
dfs(Node.Left, deep)
dfs(Node.Right, deep)
}
//开始调用
dfs(root, start)
return res
}
完事完事!