原题
原题链接:https://leetcode.com/problems/binary-tree-paths/
解法概览
解法1:迭代法,后序遍历
解法1
思路分析
本题与题129:http://blog.csdn.net/wangt443/article/details/51932147非常类似,都是使用了树的后序遍历,在后序遍历到达叶子节点的时候,对stack进行处理,获取Strng并且添加到List<String>中。
后序遍历的方法与图解请见:http://blog.csdn.net/wangt443/article/details/51863846。
代码
public class Solution257_DFS_iterator {
public List<String> binaryTreePaths(TreeNode root) {
TreeNode lastVisit = null;
Deque<TreeNode> stack = new LinkedList<TreeNode>();
List<String> stringList = new ArrayList<String>();
if (root != null)
stack.push(root);
while (!stack.isEmpty()){
while (stack.peek() != null){
TreeNode currentNode = stack.peek();
stack.push(currentNode.left);
}
stack.pop();
if (!stack.isEmpty()){
TreeNode currentNode = stack.peek();
if (currentNode.right == null || currentNode.right == lastVisit){
if (currentNode.left == null && currentNode.right == null){
String string = getStringFromStack(stack);
stringList.add(string);
}
lastVisit = stack.pop();
stack.push(null);
}
else
stack.push(currentNode.right);
}
}
return stringList;
}
private String getStringFromStack(Deque<TreeNode> stack) {
StringBuilder stringBuilder = new StringBuilder();
Iterator treeNodeIterator = stack.descendingIterator();
while (treeNodeIterator.hasNext()){
TreeNode val = (TreeNode)treeNodeIterator.next();
stringBuilder.append(val.val);
stringBuilder.append("->");
}
stringBuilder.deleteCharAt(stringBuilder.lastIndexOf("-"));
stringBuilder.deleteCharAt(stringBuilder.lastIndexOf(">"));
return stringBuilder.toString();
}
}
解法2
思路分析
递归法,递归获取左子树与右子树的List<String>并且将其中所有的String添加上当前节点的val,则完成。
出口条件为root节点为空,或者root节点为叶子节点。
代码
public class Solution257_recursive {
public List<String> binaryTreePaths(TreeNode root) {
List<String> paths = new LinkedList<String>();
if (root == null)
return paths;
if (root.left == null && root.right == null) {
paths.add(root.val + "");
return paths;
}
for (String path : binaryTreePaths(root.left))
paths.add(root.val + "->" + path);
for (String path : binaryTreePaths(root.right))
paths.add(root.val + "->" + path);
return paths;
}
}