給定一個二叉樹和一個目標和,判斷該樹中是否存在根節點到葉子節點的路徑,這條路徑上所有節點值相加等于目標和。
說明: 葉子節點是指沒有子節點的節點。
示例:
給定如下二叉樹,以及目標和 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 }
掃碼二維碼 獲取免費視頻學習資料
- 本文固定鏈接: http://www.wangchenghua.com/post/7253/
- 轉載請注明:轉載必須在正文中標注并保留原文鏈接
- 掃碼: 掃上方二維碼獲取免費視頻資料
查 看2022高級編程視頻教程免費獲取