mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-09 03:34:02 +08:00
优化 0112.路径总和 Go版本解法
This commit is contained in:
@ -531,82 +531,63 @@ class solution:
|
|||||||
```go
|
```go
|
||||||
//递归法
|
//递归法
|
||||||
/**
|
/**
|
||||||
* definition for a binary tree node.
|
* Definition for a binary tree node.
|
||||||
* type treenode struct {
|
* type TreeNode struct {
|
||||||
* val int
|
* Val int
|
||||||
* left *treenode
|
* Left *TreeNode
|
||||||
* right *treenode
|
* Right *TreeNode
|
||||||
* }
|
* }
|
||||||
*/
|
*/
|
||||||
func haspathsum(root *treenode, targetsum int) bool {
|
func hasPathSum(root *TreeNode, targetSum int) bool {
|
||||||
var flage bool //找没找到的标志
|
if root == nil {
|
||||||
if root==nil{
|
return false
|
||||||
return flage
|
|
||||||
}
|
}
|
||||||
pathsum(root,0,targetsum,&flage)
|
|
||||||
return flage
|
targetSum -= root.Val // 将targetSum在遍历每层的时候都减去本层节点的值
|
||||||
}
|
if root.Left == nil && root.Right == nil && targetSum == 0 { // 如果剩余的targetSum为0, 则正好就是符合的结果
|
||||||
func pathsum(root *treenode, sum int,targetsum int,flage *bool){
|
return true
|
||||||
sum+=root.val
|
|
||||||
if root.left==nil&&root.right==nil&&sum==targetsum{
|
|
||||||
*flage=true
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if root.left!=nil&&!(*flage){//左节点不为空且还没找到
|
|
||||||
pathsum(root.left,sum,targetsum,flage)
|
|
||||||
}
|
|
||||||
if root.right!=nil&&!(*flage){//右节点不为空且没找到
|
|
||||||
pathsum(root.right,sum,targetsum,flage)
|
|
||||||
}
|
}
|
||||||
|
return hasPathSum(root.Left, targetSum) || hasPathSum(root.Right, targetSum) // 否则递归找
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
113 递归法
|
113. 路径总和 II
|
||||||
|
|
||||||
```go
|
```go
|
||||||
/**
|
/**
|
||||||
* definition for a binary tree node.
|
* Definition for a binary tree node.
|
||||||
* type treenode struct {
|
* type TreeNode struct {
|
||||||
* val int
|
* Val int
|
||||||
* left *treenode
|
* Left *TreeNode
|
||||||
* right *treenode
|
* Right *TreeNode
|
||||||
* }
|
* }
|
||||||
*/
|
*/
|
||||||
func pathsum(root *treenode, targetsum int) [][]int {
|
func pathSum(root *TreeNode, targetSum int) [][]int {
|
||||||
var result [][]int//最终结果
|
result := make([][]int, 0)
|
||||||
if root==nil{
|
traverse(root, &result, new([]int), targetSum)
|
||||||
return result
|
|
||||||
}
|
|
||||||
var sumnodes []int//经过路径的节点集合
|
|
||||||
haspathsum(root,&sumnodes,targetsum,&result)
|
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
func haspathsum(root *treenode,sumnodes *[]int,targetsum int,result *[][]int){
|
|
||||||
*sumnodes=append(*sumnodes,root.val)
|
func traverse(node *TreeNode, result *[][]int, currPath *[]int, targetSum int) {
|
||||||
if root.left==nil&&root.right==nil{//叶子节点
|
if node == nil { // 这个判空也可以挪到递归遍历左右子树时去判断
|
||||||
fmt.println(*sumnodes)
|
return
|
||||||
var sum int
|
|
||||||
var number int
|
|
||||||
for k,v:=range *sumnodes{//求该路径节点的和
|
|
||||||
sum+=v
|
|
||||||
number=k
|
|
||||||
}
|
|
||||||
tempnodes:=make([]int,number+1)//新的nodes接受指针里的值,防止最终指针里的值发生变动,导致最后的结果都是最后一个sumnodes的值
|
|
||||||
for k,v:=range *sumnodes{
|
|
||||||
tempnodes[k]=v
|
|
||||||
}
|
|
||||||
if sum==targetsum{
|
|
||||||
*result=append(*result,tempnodes)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if root.left!=nil{
|
|
||||||
haspathsum(root.left,sumnodes,targetsum,result)
|
targetSum -= node.Val // 将targetSum在遍历每层的时候都减去本层节点的值
|
||||||
*sumnodes=(*sumnodes)[:len(*sumnodes)-1]//回溯
|
*currPath = append(*currPath, node.Val) // 把当前节点放到路径记录里
|
||||||
}
|
|
||||||
if root.right!=nil{
|
if node.Left == nil && node.Right == nil && targetSum == 0 { // 如果剩余的targetSum为0, 则正好就是符合的结果
|
||||||
haspathsum(root.right,sumnodes,targetsum,result)
|
// 不能直接将currPath放到result里面, 因为currPath是共享的, 每次遍历子树时都会被修改
|
||||||
*sumnodes=(*sumnodes)[:len(*sumnodes)-1]//回溯
|
pathCopy := make([]int, len(*currPath))
|
||||||
|
for i, element := range *currPath {
|
||||||
|
pathCopy[i] = element
|
||||||
|
}
|
||||||
|
*result = append(*result, pathCopy) // 将副本放到结果集里
|
||||||
}
|
}
|
||||||
|
|
||||||
|
traverse(node.Left, result, currPath, targetSum)
|
||||||
|
traverse(node.Right, result, currPath, targetSum)
|
||||||
|
*currPath = (*currPath)[:len(*currPath)-1] // 当前节点遍历完成, 从路径记录里删除掉
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user