回溯很大感觉就是多重递归,在递归的题目中,例如斐波那契数列,只需要考虑当前情况以及他的子情况。而在回溯中,要进行很多次递归,并且要对条件进行处理。
LeetCode257:给你一个二叉树的根节点root,按任意顺序,返回所有从根节点到叶子节点的路径。
叶子节点是指没有子节点的节点。
示例:
输入:root=[1,2,3,nu11,5]
输出:["1->2->5","1->3"]
class BinaryTreePaths {
List<String> ans = new ArrayList<>();
public List<String> binaryTreePaths(TreeNode root) {
dfs(root, new ArrayList<>());
return ans;
}
private void dfs(TreeNode root, List<Integer> temp) {
if (root == null) return;
temp.add(root.val);
// 如果是叶子节点记录结果
if (root.left == null && root.right == null) {
ans.add(getPathString(temp));
}
dfs(root.left, temp);
dfs(root.right, temp);
temp.remove(temp.size() - 1);
}
// 拼接结果
private String getPathString(List<Integer> temp) {
StringBuilder sb = new StringBuilder();
sb.append(temp.get(0));
for (int i = 1; i < temp.size(); i++) {
sb.append("->").append(temp.get(i));
}
return sb.toString();
}
}
进入dfs,将当前节点添加到temp列表中,如果是叶子节点,那说明当前分支已经处理完了,像结果列表中添加拼接后的temp列表。
如果不是叶子节点,那么就遍历左子树,右子树,按照前序的顺序来回溯,注意在当前分支结束后,要将最下面的那个节点去掉。