代码随想录补打卡 112路径总和 654最大二叉树

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

说明: 叶子节点是指没有子节点的节点。

示例: 给定如下二叉树,以及目标和 sum = 22,

112.路径总和1

返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。

代码如下  

/**

 * Definition for a binary tree node.

 * type TreeNode struct {

 *     Val int

 *     Left *TreeNode

 *     Right *TreeNode

 * }

 */

func hasPathSum(root *TreeNode, targetSum int) bool {

         if root == nil {

             return false 

         }                                                       //如果树不存在直接返回false

         

         var traverse func(node *TreeNode,sum int) bool 

         traverse = func(node *TreeNode,sum int) bool {     //定义函数

             if node.Left == nil && node.Right == nil {   如果遇到叶子节点进行判断

                 if sum == targetSum {             // 这个总和是否等于目标值

                     return true 

                 }else {

                     return false 

                 }

             }

             if node.Left != nil {                     //左子树是否为空

                 sum += node.Left.Val          // 总和加上左子树的值

                 if traverse(node.Left, sum) == true {        //如果有符合的左子树,则直接向上返回true

                     return true 

                 }

                 sum -= node.Left.Val        //回溯时将加上的左接待去掉

             }

              if node.Right != nil {    //同理遍历右子树

                 sum += node.Right.Val 

                 if traverse(node.Right, sum) == true {

                     return true 

                 }

                 sum -= node.Right.Val 

             }

             return false 

         }

         res := traverse(root,root.Val)

         return res 

}

给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:

  • 二叉树的根是数组中的最大元素。
  • 左子树是通过数组中最大值左边部分构造出的最大二叉树。
  • 右子树是通过数组中最大值右边部分构造出的最大二叉树。

通过给定的数组构建最大二叉树,并且输出这个树的根节点。

代码如下

/**

 * Definition for a binary tree node.

 * type TreeNode struct {

 *     Val int

 *     Left *TreeNode

 *     Right *TreeNode

 * }

 */

func constructMaximumBinaryTree(nums []int) *TreeNode {

        return makenode(&nums) 

}

func makenode(nums *[]int ) *TreeNode{    // 制造节点函数

    if len(*nums) == 0 {     //如果该切片的大小为0则返回空

        return nil 

    }

    maxval, Leftarr,Rightarr := findmaxval(nums)   //调用定义的寻找最大值函数

    root := &TreeNode {      //开始构造二叉树

        maxval,            // 最大值   ,每次定义时,会先把这个节点的值确定。然后在去定义这个值得左子树,定义左子树的时候,将切分好的左半部分切片传进去,作为左子树的原始数组,左子树的原始数组在找到一个新的最大值,并且以这个新的最大值为界分为左右两个新的切片,如此不断递归,定义完左半边,开始定义右半边

        makenode(&Leftarr),   //左半边

        makenode(&Rightarr),

    }

    return root

}


 

func findmaxval(nums *[]int) (maxval int , leftarr []int ,rightarr []int ) {   //定义寻找最大值函数

    val := math.MinInt           // 传入一个切片,返回值为该切片里的最大值,并且这个值将切片分成左半部分和右半部分,定义一个最小值

    index := -1     //定义一个初始下标为-1

    for i , v := range *nums {     //循环遍历

        if v > val {       

            val = v               //将大的值放到val中,这样就找到了最大值

            index = i

        }

    }

    return val , (*nums)[:index] ,(*nums)[index+1:]   // 返回这个最大值,并且定义两个新的切片,以最大值为分界点

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值