Given a binary tree, return all root-to-leaf paths.
Note: A leaf is a node with no children.
Example:
Input: 1 / \ 2 3 \ 5 Output: ["1->2->5", "1->3"] Explanation: All root-to-leaf paths are: 1->2->5, 1->3
题解:
1.从叶向根构建路径
public List<String> binaryTreePaths(TreeNode root) {
if (root == null) {
return new ArrayList<String>();
}
List<String> result = new ArrayList();
List<String> leftPath = binaryTreePaths(root.left);
for(String each : leftPath) {
result.add(root.val + "->" + each);
}
List<String> rightPath = binaryTreePaths(root.right);
for(String each : rightPath) {
result.add(root.val + "->" + each);
}
if (result.isEmpty()) {
result.add(""+root.val);
}
return result;
}
2. 自根向底构建路径,传递字符串
public List<String> binaryTreePaths(TreeNode root) {
List<String> result = new LinkedList();
traverseTree(root, "", result );
return result;
}
public void traverseTree(TreeNode root, String s, List<String>result){
if (root == null) {
return;
}
if (root.left == null && root.right == null) {
result.add(s + root.val);
return;
}
if (root.left != null) {
traverseTree(root.left, s + root.val + "->", result);
}
if (root.right != null) {
traverseTree(root.right, s + root.val + "->", result);
}
}
3. 自根向下构建路径,采用回溯法(慢,由于最后的转字符串过程)
如果有更快的转字符串方式,请告诉我-.-
public List<String> binaryTreePaths(TreeNode root) {
List<String> res= new LinkedList<>();
if(root==null) return res;
binaryTreePathCore(res,new LinkedList<>(),root);
return res;
}
private void binaryTreePathCore(List<String> res,LinkedList<TreeNode> tmp,TreeNode root){
tmp.add(root);
if(root.left==null && root.right==null){
// res.add(new ArrayList<>(tmp).toString());
StringBuilder s= new StringBuilder();
int len= tmp.size();
s.append(tmp.get(0).val);
for(int i=1; i<len; i++){
s.append("->"+tmp.get(i).val);
}
res.add(s.toString());
}
if(root.left!=null)
binaryTreePathCore(res,tmp,root.left);
tmp.remove(root.left);
if(root.right!=null)
binaryTreePathCore(res,tmp,root.right);
tmp.remove(root.right);
tmp.remove(root);
}