给你一个二叉树的根节点 root
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [1,2,3,null,5] 输出:["1->2->5","1->3"]
示例 2:
输入:root = [1] 输出:["1"]
解题思路:题目首先是二叉树,其次要求记录所有的路径
根据二叉树很容易想到递归,而每次递归到的路径要记录因此似乎不得不使用递归。
递归的话则要考虑三步。
1、递归返回值和传入参数,这里不用返回具体的变量,直接对全局变量处理,传入参数则是节点,路径和最终答案。
public void backtracking(TreeNode root,int paths,String res){
(处理逻辑);
}
2、递归终止条件:由于是遍历到叶节点就结束遍历,所以终止条件是遍历到叶子节点,但是处理节点的前提是要先将节点添加到路径中。
paths.add(root.val);
if(node.left==null&&node.right==null){
(中节点处理逻辑:将路径转化为String类型并且添加到res中);
return;
}
3、一次递归(回溯)的逻辑。
为什么要回溯的逻辑已经在上文中讲了,现在讲讲在哪儿回溯。
回溯发生在每次递归后。每次调用递归函数就有节点加入路径,那么在递归调用结束后需要将该节点弹出,满足搜索下一路径的条件。
// 在递归(回溯)之前要先判断当前节点是否为空,避免空指针异常
if(root.left!=null){
backtracking(root.left,paths,res);
paths.remove(paths.size()-1);
}
if(root.right!=null){
backtraking(root.right,paths,res);
paths.remove(paths.size()-1);
}