给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。
说明: 叶子节点是指没有子节点的节点。
示例: 给定如下二叉树,以及目标和 sum = 22,
返回 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:] // 返回这个最大值,并且定义两个新的切片,以最大值为分界点
}