Problem
Given a binary tree, return all root-to-leaf paths.
Example
Given the following binary tree:
1
/ \
2 3
\
5
All root-to-leaf paths are:
[
"1->2->5",
"1->3"
]
思路一(divide & conquer)
- get a left child's list and a right child's list
- prepend root to every string in these two lists
- put them to root list
- if root is null , return empty list
- root does not contains any children, return a list containing itself
public List<String> binaryTreePaths(TreeNode root) {
List<String> list = new ArrayList<>();
if (root == null) {
return list;
}
if (root.left == null && root.right == null) {
list.add(String.valueOf(root.val));
return list;
}
List<String> left = binaryTreePaths(root.left);
List<String> right = binaryTreePaths(root.right);
// String s = String.valueOf(root.val);
StringBuilder sb = new StringBuilder();
sb.append(root.val);
for (int i = 0; i < left.size(); i++) {
int len = sb.length();
sb.append("->").append(left.get(i));
list.add(sb.toString());
sb.setLength(len);
}
for (int i = 0; i < right.size(); i++) {
int len = sb.length();
sb.append("->").append(right.get(i));
list.add(sb.toString());
sb.setLength(len);
}
return list;
}
scala
def binaryTreePaths(root: TreeNode): List[String] = {
if (root == null) return List.empty[String]
if (root.left == null && root.right == null) return List(root.value.toString)
val leftPaths = binaryTreePaths(root.left)
val rightPaths = binaryTreePaths(root.right)
leftPaths.map(p => s"${root.value}->$p") ::: rightPaths.map(p => s"${root.value}->$p")
}
python
def binaryTreePaths(self, root: TreeNode) -> List[str]:
if not root:
return []
if not root.left and not root.right:
return [str(root.val)]
paths: List[str] = []
left_paths: List[str] = self.binaryTreePaths(root.left)
right_paths: List[str] = self.binaryTreePaths(root.right)
for p in left_paths:
paths.append(f'{root.val}->{p}')
for p in right_paths:
paths.append(f'{root.val}->{p}')
return paths
思路二(traverse + backtrack)
- 一个stringbuilder
- 一个result list, 顺序记录
- 同等level加一个就要backtrack一次
public List<String> binaryTreePaths(TreeNode root) {
List<String> result = new ArrayList<>();
StringBuilder sb = new StringBuilder();
helper(root, sb, result);
return result;
}
private void helper(TreeNode root, StringBuilder sb, List<String> result) {
if (root == null) {
return;
}
if (root.left == null && root.right == null) {
int len = sb.length();
sb.append(root.val);
result.add(sb.toString());
sb.setLength(len);
return;
}
int len = sb.length();
sb.append(root.val);
sb.append("->");
helper(root.left, sb, result);
helper(root.right, sb, result);
sb.setLength(len);
}
思路三(traverse)
def binaryTreePaths(self, root):
res = []
def helper(root, p):
if not root:
return
if not root.left and not root.right:
res.append(p + str(root.val))
return
helper(root.left, p + str(root.val) + '->')
helper(root.right, p + str(root.val) + '->')
helper(root, "")
return res