【Golang主题学习月】 刷题比玩游戏好多了,成就感越来越强,每天坚持刷一道题,每天锻炼30分钟,等8块腹肌,等大厂offer.
😄
我相信,如果在面试中遇到此题,逻辑清晰、正确表达出来、手撕
应该会超过一部分的面试者。
对树不熟悉的朋友,可以看看前面的基础训练题哦!
leecode 112. 路径总和
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。
叶子节点 是指没有子节点的节点。
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
输入:root = [1,2,3], targetSum = 5
输出:false
参考代码
定义一颗树
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int // 根
* Left *TreeNode //左节点
* Right *TreeNode //右节点
* }
*/
GO语言版 递归
- 要知道这是一棵树,只是通过数组的形式表现出来的
简单的用这颗树来举例
比较简单,就是通过递归自顶向下的找到一棵树,用目标值sum减去左子树和右子树,看是否等于空,
因为等于空代表这颗树的左节点或者右节点就是最后的子节点。
func hasPathSum(root *TreeNode, sum int) bool {
if root == nil {
return false
}
if root.Left == nil && root.Right == nil {
return sum == root.Val
}
return hasPathSum(root.Left, sum - root.Val) || hasPathSum(root.Right, sum - root.Val)
}
迭代版
迭代版其实也很简单,利用栈或者队列
可以想一想,队列还是栈比较好? 队列的性质就是先进先出,我们添加一个节点,就进行累加,如果左节点或右节点不为空,就加入队列,在弹出继续累加,如果累加之和等于目标值,结果返回true.
-
定义一个队列node,保存树(先进先出)
-
定义一个队列val,记录累加值
-
初始化队列node,将整棵树添加进队列,因为我还要根据这棵树的左节点或右节点判断。
-
取出根节点,记录累加值为根节点
-
队列node元素,不为0,因为咱要判断这颗树到底遍历完没
-
从队列node取出一个元素,就是刚刚加入进去这颗树啦
-
从队列val中,取出根节点,为累加值
8. 如果左节点或者右节点为空,说明到底了,看累加值是否等于目标值,如果等于返回true.
-
取出来的这颗树的左节点不为空,将以左节点为根的树加入队列node, 队列val累加值 = 累加值 + 左节点为根的左子树的根,其实就是它本身。 回到第5步,往下走。
-
取出来的这颗树的右节点不为空,将以右节点为根的树加入队列node, 队列val累加值 = 累加值 + 右节点为根的右子树的根,其实就是它本身。 回到第5步,往下走。
11. 如果这棵树都遍历完了,都没有找到目标值,返回false.
func hasPathSum(root *TreeNode, sum int) bool {
if root == nil {
return false
}
queNode := []*TreeNode{} // 1.
queVal := []int{} // 2.
queNode = append(queNode, root) // 3.
queVal = append(queVal, root.Val) // 4.
for len(queNode) != 0 { // 5.
now := queNode[0] // 6.
queNode = queNode[1:]
temp := queVal[0] // 7.
queVal = queVal[1:]
if now.Left == nil && now.Right == nil { // 8.
if temp == sum {
return true
}
continue
}
if now.Left != nil { // 9.
queNode = append(queNode, now.Left)
queVal = append(queVal, now.Left.Val + temp)
}
if now.Right != nil { // 10.
queNode = append(queNode, now.Right)
queVal = append(queVal, now.Right.Val + temp)
}
}
return false
}
真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话
求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!
如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️