1. 程式人生 > 實用技巧 >leetcode刷題筆記一百一十三題 路徑問題II

leetcode刷題筆記一百一十三題 路徑問題II

leetcode刷題筆記一百一十三題 路徑問題II

源地址:113. 路徑總和 II

問題描述:

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

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

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

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

返回:

[
[5,4,11,2],
[5,8,4,5]
]

/**
本題中使用回溯思想,需要注意的是對於每個結點的左右節點進行遍歷,由於只使用一個Path變數儲存遍歷路徑,所以回退時需要注意。
*/
/**
 * Definition for a binary tree node.
 * class TreeNode(var _value: Int) {
 *   var value: Int = _value
 *   var left: TreeNode = null
 *   var right: TreeNode = null
 * }
 */
import scala.collection.mutable
object Solution {
    def pathSum(root: TreeNode, sum: Int): List[List[Int]] = {
        if (root == null) return List()
        var path = new mutable.ListBuffer[Int]()
        val res = new mutable.ListBuffer[List[Int]]()
        dfs(root, sum)
        

        def dfs(root: TreeNode, sum:Int): Unit = {
            //回溯條件一
            if (root == null) return
            path += root.value
			
            //回溯條件二 滿足條件下儲存Path
            if((sum - root.value) == 0 && root.left == null && root.right == null){
                res += path.toList
                //這種情況下可能需要遍歷另一子樹,需要回溯
                path = path.dropRight(1)
                return
            }

            dfs(root.left, sum - root.value)
            dfs(root.right, sum - root.value)
            path = path.dropRight(1)
        }
        return res.toList        
    }
}