大家好,我是被白菜拱的猪。
一个热爱学习废寝忘食头悬梁锥刺股,痴迷于girl的潇洒从容淡然coding handsome boy。
一、题目内容
给定一个二叉树,返回所有从根节点到叶子节点的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
输入:
1
/ \
2 3
\
5
输出: [“1->2->5”, “1->3”]
解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3
二、解题思路
使用深度优先便利,设置一个参数把路径保存出来,需要注意的是,这里为了让效率搞一些使用了StringBuilder这个类,我还特地查了一下String与StringBuilder,StringBuffer的区别。另外,每进去一次就要创建一个StringBuilder,这是容易出错的地方,因为你要保证回溯后回上一个路径的状态。假如不新建,那么就是直接在原先的基础上加,这显然是错误的。
今日除了了解StringBuilder,还知道了前中后序遍历是基于深度优先遍历,也就是说前中后都是深度优先遍历。访问都是从根节点开始,但是他们的区别是什么时候do something with root。
三、代码实现
class Solution {
private List<String> res = new LinkedList<>();
public List<String> binaryTreePaths(TreeNode root) {
preOrder(root,"");
return res;
}
public void preOrder(TreeNode root,String path) {
if(root == null ) return;
StringBuilder builder = new StringBuilder(path);
if(root.left == null && root.right ==null) {
builder.append(root.val);
res.add(builder.toString());
return;
}
builder.append(root.val+"->");
preOrder(root.left,builder.toString());
preOrder(root.right,builder.toString());
}
}
改善过后,这里就是把公共的代码抽离出来,没想到效率提高这么多,所以在日后敲代码的时候要多加大关注在这方面的细节问题。
class Solution {
private List<String> res = new ArrayList<>();
public List<String> binaryTreePaths(TreeNode root) {
preOrder(root,"");
return res;
}
public void preOrder(TreeNode root,String path) {
if(root == null ) return;
StringBuilder builder = new StringBuilder(path);
builder.append(root.val);
if(root.left == null && root.right ==null) {
res.add(builder.toString());
return;
}
builder.append("->");
preOrder(root.left,builder.toString());
preOrder(root.right,builder.toString());
}
}