LeetCode[257]二叉树的所有路径
思路:
这道题是要求出根节点到叶子节点的路径,那不用想了,肯定是根左右,也就是前序遍历来搞,既然我们已经明确了是前序遍历来搞,那么就该考虑是纯递归还是回溯了,其实这道题回溯和递归都可以,我这里就主要将回溯了。
回溯首先就要明确退出递归的条件是什么,肯定是左右子节点都为空,这就是叶子节点的情况,我们可以直接计算结果添加到结果集中,然后递归左右子树,递归之后做回溯,就是这么简单,递归和回溯是同时进行的。
代码:
回溯解法:
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {public List<String> binaryTreePaths(TreeNode root) {List<String> res = new ArrayList<>();if(root == null) return res;List<Integer> path = new ArrayList<>();travelsal(root, path, res);return res;}public void travelsal(TreeNode root, List<Integer> path, List<String> res){path.add(root.val);if(root.left == null && root.right == null){StringBuilder sb = new StringBuilder();for(int i=0;i<path.size()-1;i++){sb.append(path.get(i)).append("->");}sb.append(path.get(path.size()-1));res.add(sb.toString());}if(root.left != null){travelsal(root.left, path, res);path.remove(path.size()-1);}if(root.right != null){travelsal(root.right, path, res);path.remove(path.size()-1);}}}
递归解法:
class Solution {List<String> result = new ArrayList<>();public List<String> binaryTreePaths(TreeNode root) {deal(root, "");return result;}public void deal(TreeNode node, String s) {if (node == null)return;if (node.left == null && node.right == null) {result.add(new StringBuilder(s).append(node.val).toString());return;}String tmp = new StringBuilder(s).append(node.val).append("->").toString();deal(node.left, tmp);deal(node.right, tmp);}
}