1 寻找二叉树所有路径(leetcode 257)
1.1 backtracking设计
从可选取列表选择当前遍历元素,进行递归调用,递归调用后再进行回溯,即把该元素从选取列表中移除,进入下一个回溯递归调用。
if(root.left != null){
backTracking(root.left, path);
path.remove(path.size() - 1);
}
if(root.right != null){
backTracking(root.right, path);
path.remove(path.size() - 1);
}
终止条件,当遍历到叶子节点就终止遍历
if(root.left == null && root.right == null){
list.add(new ArrayList<>(path));
return;
}
确定参数,再递归过程中,一方面要用path记录已经选取的结果集,另一方面要有一个候选列表可供当前选择。
public void backTracking(TreeNode root, List path){
1.2 算法设计代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @author zdh
* @date 2021/7/10 17:48
*/
public class BinTreePaths {
List<List<Integer>> list = new ArrayList<>();
List<String> strings = new ArrayList<>();
List<Integer> path = new ArrayList<>();
public List<String> binaryTreePaths(TreeNode root) {
list.clear();
path.clear();
strings.clear();
backTracking(root, path);
for (List l:
list) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < l.size(); i++) {
sb.append("->"+l.get(i));
}
sb.replace(0,2, "");
strings.add(sb.toString());
}
return strings;
}
public void backTracking(TreeNode root, List path){
path.add(root.val);
if(root.left == null && root.right == null){
list.add(new ArrayList<>(path));
return;
}
if(root.left != null){
backTracking(root.left, path);
path.remove(path.size() - 1);
}
if(root.right != null){
backTracking(root.right, path);
path.remove(path.size() - 1);
}
}
public static void main(String[] args) {
TreeNode t4 = new TreeNode(4, null, null);
TreeNode t3 = new TreeNode(3, null, null);
TreeNode t2 = new TreeNode(2, t3, t4);
TreeNode t = new TreeNode(1, null, t2);
List<String > lists = new BinTreePaths().binaryTreePaths(t);
for (String l:
lists) {
System.out.println(l);
}
}
}