一、题目描述
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点 是指没有子节点的节点。
二、思路
提到根节点到叶子节点的路径,那一定就是先序遍历了。我们要拿到一条路径是很简单的,只要从根节点开始沿途一直寻找到叶子节点就可以了,本题的难点在于如何得到所有的路径。也就是当我们达到了叶子节点之后,还要回溯回去,换个方向找找还有没有其他的路径。 说到这里 —— 那么这道题就转化为一道回溯法的问题了,让我们用回溯的思路来解决它吧 ~
- 回溯法参数 : 当前遍历到的节点
root
、 当前得到的路径path
- 结束条件 : 找到叶子节点,即左右子节点都为空的节点
- 单层逻辑: 在路径中加入当前节点值 root.val,判断左子节点是否为空,不为空则递归调用左节点,然后回溯。对右子节点同理。
三、代码
List<String> ansPaths = new ArrayList<>();
// 二叉树的所有路径 —— 回溯
public List<String> binaryTreePaths(TreeNode root) {
List<Integer> path = new ArrayList<>();
backTrace(path, root);
return ansPaths;
}
public void backTrace(List<Integer> path, TreeNode root){ // path为数字路径, root 为节点
path.add(root.val);
// 退出条件 —— 到达叶子节点,即左右子树都为 null —— 此时组合 path 为 String, 加入 ansPaths 中
if(root.left == null && root.right == null){
StringBuilder sb = new StringBuilder();
for(Integer node: path){
sb.append(node).append("->");
}
ansPaths.add(sb.substring(0, sb.length()-2));
return;
}
if(root.left != null){
backTrace(path, root.left);
path.remove(path.size() - 1);
}
if(root.right != null){
backTrace(path, root.right);
path.remove(path.size() - 1);
}
}