题目描述:
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。
输入:root = [1,2,3,null,5]
输出:["1->2->5","1->3"]
思路分析:
这个题一眼回溯,回溯和递归其实也是紧密相关的。
1.确定回溯函数的参数 (1.root 2.一个路径 3. 所有路径)
2.回溯条件:到达叶子节点(左右孩子都为nil)
3.单层处理条件:左孩子进了后右孩子进。
这里需要注意的是有一个递归就对应了一个回溯。同时不用显式进行回溯的原因是不是因为path并没有采用地址传递,而是拷贝,每次到达回溯的结束条件,进行返回的时候,path的值就是进入回溯之前的path值
先看代码:
点击查看代码
func binaryTreePaths(root *TreeNode) []string {
res := []string{}
path := []int{}
if root == nil {
return res
}
traveralRoot(root,path,&res)
return res
}
//不用显式进行回溯的原因是不是因为path并没有采用地址传递,而是拷贝,每次到达回溯的结束条件,进行返回的时候,path的值就是进入回溯之前的path值
func traveralRoot(root *TreeNode,path []int,res *[]string) {
path = append(path, root.Val)
// 递归终止条件: 到达叶子节点
if root.Left == nil && root.Right == nil {
// 构建路径字符串
pathStr := fmt.Sprintf("%d", path[0]) // 初始化字符串
for i := 1; i < len(path); i++ {
pathStr = fmt.Sprintf("%s->%d", pathStr, path[i]) // 连接字符串
}
*res = append(*res, pathStr) // 将路径加入结果集
return
}
// 3.递归访问左子树
if root.Left!= nil {
traveralRoot(root.Left,path,res)
}
if root.Right!= nil {
traveralRoot(root.Right,path,res)
}
}