给定一个二叉树,返回所有从根节点到叶子节点的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
输入:
1
/ \
2 3
\
5
输出: ["1->2->5", "1->3"]
解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3
思路:
1.root为空,易知,只有一种情况,那就是题目所给是空树
2.没有左右孩子,当前节点是叶子节点,所以形成一条路径=s(根节点到父节点路径)+当前节点。把此路径添加到 list 中并返回。
3.存在左孩子,且根节点到当前节点路径=s(根节点到父节点路径)+当前节点值+"->",所以把根节点到当前节点的路径作为参数传给左孩子,一直递归下去,直到没有左右孩子为止(第2种情况)。
4.存在右孩子,且到根节点当前节点路径=s(根节点到父节点路径)+当前节点值+"->",所以把根节点到当前节点的路径作为参数传给右孩子,一直递归下去,直到没有左右孩子为止(第2种情况)。
补充一个细节:
两个字符串相加生成的一个新的字符串,地址和原字符串不一样,所以参数传递值传递,不是引用传递。
代码:
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
List<String> list=new LinkedList<String>();
helper(root,list,new String());
return list;
}
public void helper(TreeNode root,List<String>list,String s){
if(root==null) //root为空,易知,只有一种情况,那就是题目所给是空树。
return;
if(root.left==null&&root.right==null){ //没有左右孩子,当前节点是叶子节点,所以形成一条路径=s(根节点到父节点路径)+当前节点
list.add(s+root.val);
return ;
}
if(root.left!=null)
helper(root.left,list,s+root.val+"->"); //存在左孩子,所以到当前节点路径=s(根节点到父节点路径)+当前节点值+"->"
if(root.right!=null)
helper(root.right,list,s+root.val+"->"); //同理
}
}