編程學習網 > 編程語言 > go > Go刷LeetCode系列:二叉樹(3)二叉樹路徑和
2020
04-15

Go刷LeetCode系列:二叉樹(3)二叉樹路徑和



給定一個二叉樹和一個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等于目標和。

說明: 葉子節點是指沒有子節點的節點。

示例: 
給定如下二叉樹,以及目標和 sum = 22,

              5 / \ 4  8
           /   / \ 11  13  4
         /  \      \
        7 2 1

返回 true, 因為存在目標和為 22 的根節點到葉子節點的路徑 5->4->11->2。

解題思路:

1,對于二叉樹類型題目一般都是遞歸解

2,遞歸有兩種:自根向下和自葉子向上

3,對于相等類型題目和最大值題目解題思路相反,本題采用自根向下

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func hasPathSum(root *TreeNode, sum int) bool {
    if root==nil{
        return false
    }
    if root.Left==nil && root.Right==nil{
        return root.Val==sum
    }
    return hasPathSum(root.Left,sum-root.Val)||hasPathSum(root.Right,sum-root.Val)
}

給定一個二叉樹和一個目標和,找到所有從根節點到葉子節點路徑總和等于給定目標和的路徑。

說明: 葉子節點是指沒有子節點的節點。

示例:
給定如下二叉樹,以及目標和 sum = 22,

              5 / \ 4 8 /   / \ 11 13 4 /  \    / \
        7 2 5 1

返回:

[
   [5,4,11,2],
   [5,8,4,5]
]
思路:

1,同樣是遞歸,需要每一次把走過的路徑存下來傳下去,如果滿足條件就返回,否則舍棄

2,注意golang 傳slice 和map的坑,雖然slice的len是每次傳值,但是數據地址是一樣的,所以會覆蓋掉,每次數據結果都不一樣

3,解決辦法copy函數進行復制。

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func pathSum(root *TreeNode, sum int) [][]int {
    var r [][]int
    if root ==nil{
        return r
    }
    var temp []int
    return walk(root,sum,temp)
}

func walk(root *TreeNode, sum int,temp1 []int)([][]int){
     var r [][]int
    if root==nil{
        return r
    }
    temp:=make([]int,len(temp1))
    copy(temp,temp1)
     temp=append(temp,root.Val)
   //fmt.Println(root,temp,sum)
     if root.Left==nil && root.Right==nil{
        if root.Val==sum{
            r=append(r,temp)
        // fmt.Println(root,temp,sum,r)
            return r
        }
         return r
     }
            
        tl:=walk(root.Left,sum-root.Val,temp)
        tr:=walk(root.Right,sum-root.Val,temp)

         if len(tl)>0 {
             r=append(r,tl...)
         }
         if len(tr)>0 {
             r=append(r,tr...)
         }
    return r
}

掃碼二維碼 獲取免費視頻學習資料

Python編程學習

查 看2022高級編程視頻教程免費獲取