二叉树之路径总和|Go主题月

2,244 阅读3分钟

【Golang主题学习月】 刷题比玩游戏好多了,成就感越来越强,每天坚持刷一道题,每天锻炼30分钟,等8块腹肌,等大厂offer.

😄

 \color{red}{~}

我相信,如果在面试中遇到此题,逻辑清晰、正确表达出来、手撕

应该会超过一部分的面试者。

对树不熟悉的朋友,可以看看前面的基础训练题哦!

leecode 112. 路径总和

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。

叶子节点 是指没有子节点的节点。

图片.png

输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22

输出:true

图片.png

输入:root = [1,2,3], targetSum = 5

输出:false


参考代码

定义一颗树

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int          // 根
 *     Left *TreeNode   //左节点
 *     Right *TreeNode  //右节点
 * }
 */

GO语言版 递归

  1. 要知道这是一棵树,只是通过数组的形式表现出来的

图片.png

简单的用这颗树来举例

比较简单,就是通过递归自顶向下的找到一棵树,用目标值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.

  1. 定义一个队列node,保存树(先进先出)

  2. 定义一个队列val,记录累加值

  3. 初始化队列node,将整棵树添加进队列,因为我还要根据这棵树的左节点或右节点判断。

  4. 取出根节点,记录累加值为根节点

  5. 队列node元素,不为0,因为咱要判断这颗树到底遍历完没

  6. 从队列node取出一个元素,就是刚刚加入进去这颗树啦

  7. 从队列val中,取出根节点,为累加值

8. 如果左节点或者右节点为空,说明到底了,看累加值是否等于目标值,如果等于返回true.

  1. 取出来的这颗树的左节点不为空,将以左节点为根的树加入队列node, 队列val累加值 = 累加值 + 左节点为根的左子树的根,其实就是它本身。 回到第5步,往下走。

  2. 取出来的这颗树的右节点不为空,将以右节点为根的树加入队列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块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️