34. 二叉树中和为某个值的路径

题目

输入一颗二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。

二叉树节点定义如下:

type TreeNode struct {
	val   int
	left  *TreeNode
	right *TreeNode
}

假设有如下二叉树:

        10 
    5        12
  4   7

目标和为22,则打印出两条路径:[10, 5, 7], [10, 12]

解题思路

先序遍历。遍历到某个节点时,把节点保存下来,并且累计求和。如果遇到叶子节点,而且和正好为目标值,则打印路径。否则,继续遍历非空左右子节点。

在返回父节点前,需要在路径上删除当前节点。

实现代码

func FindPath(root *TreeNode, targetSum int) [][]int {
	if root == nil {
		return nil
	}

	var path []int
	var paths [][]int
	curSum := 0
	doFindPaths(root, targetSum, curSum, path, &paths)
	return paths
}

func doFindPaths(root *TreeNode, targetSum int, curSum int, path []int, paths *[][]int) {
	path = append(path, root.val)
	curSum += root.val
	if isLeaf(root) && curSum == targetSum {
		*paths = append(*paths, path)
		fmt.Printf("find path:%v", path)
	}

	if root.left != nil {
		doFindPaths(root.left, targetSum, curSum, path, paths)
	}

	if root.right != nil {
		doFindPaths(root.right, targetSum, curSum, path, paths)
	}
	//返回父节点前,在路径上删除当前节点
	path = path[:len(path)-1]
}

func isLeaf(node *TreeNode) bool {
	return node.left == nil && node.right == nil
}

Last updated

Was this helpful?