力扣257题(二叉树的所有路径)
257、二叉树的所有路径
具体实现:
1.递归函数参数和返回值
参数:根节点,记录每一条路径的path,存放结果集的result
返回值:无
2.递归终止条件
遍历到叶子节点,也就是这个节点没有左孩子和右孩子时
path来记录路径
res存放结果
if (root.left == null && root.right == null){ StringBuilder sb = new StringBuilder(); for (int i = 0; i < paths.size() - 1; i++){ sb.append(paths.get(i)).append("->"); } sb.append(paths.get(paths.size()-1)); res.add(sb.toString()); return; }
3.单层递归逻辑
if (root.left != null){ traversal(root.left, paths, res); paths.remove(paths.size() -1); } if (root.right != null){ traversal(root.right, paths, res); paths.remove(paths.size() -1); }
代码:
class Solution { public List<String> binaryTreePaths(TreeNode root) { List<String> res = new ArrayList<>(); if(root == null) return res; List<Integer> paths = new ArrayList<>(); traversal(root,paths,res); return res; } private void traversal(TreeNode root, List<Integer> paths, List<String> res){ paths.add(root.val); if (root.left == null && root.right == null){ StringBuilder sb = new StringBuilder(); for (int i = 0; i < paths.size() - 1; i++){ sb.append(paths.get(i)).append("->"); } sb.append(paths.get(paths.size()-1)); res.add(sb.toString()); return; } if (root.left != null){ traversal(root.left, paths, res); paths.remove(paths.size() -1); } if (root.right != null){ traversal(root.right, paths, res); paths.remove(paths.size() -1); } } }
class Solution { /** * 迭代法 */ public List<String> binaryTreePaths(TreeNode root) { List<String> result = new ArrayList<>(); if (root == null) return result; Stack<Object> stack = new Stack<>(); // 节点和路径同时入栈 stack.push(root); stack.push(root.val + ""); while (!stack.isEmpty()) { // 节点和路径同时出栈 String path = (String) stack.pop(); TreeNode node = (TreeNode) stack.pop(); // 若找到叶子节点 if (node.left == null && node.right == null) { result.add(path); } //右子节点不为空 if (node.right != null) { stack.push(node.right); stack.push(path + "->" + node.right.val); } //左子节点不为空 if (node.left != null) { stack.push(node.left); stack.push(path + "->" + node.left.val); } } return result; } }