关于二叉树的问题,我首先想到的就是递归的算法,因为二叉树的相关算法总会设计到回溯。
给定一个二叉树,返回所有从根节点到叶子节点的路径。
说明: 叶子节点是指没有子节点的节点。
这个题和我之前的写的那个爬楼梯的那个题有着相同的含义。同样是使用递归的算法。
1.首先先判定每一个节点有哪些的动作。每一个节点都会向左走和向右走。抓住这个就行。
2.判断结束条件,当节点走到底的时候就不会往下走了,也就是节点的左右节点都为null。同时也就是我们所说的叶子节点。
3.最后再看题目的输出结果,是一个List<String>类型的变量,因此我们就应该决定所构造函数的形参了。
代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
List<String> list=new ArrayList<>();
public List<String> binaryTreePaths(TreeNode root) {
if(root==null){
return list;
}
perm(root,"");
return list;
}
public void perm(TreeNode root,String str){
str=str+String.valueOf(root.val);
if(root.left!=null){
perm(root.left,str+"->");
}
if(root.right!=null){
perm(root.right,str+"->");
}
if(root.left==null&&root.right==null){
list.add(str);
}
}
}
主要是看函数perm里面的算法。这里我传入的一个str形参用来记录路径。
以题目的例子为例:
首先我先访问根节点1。访问这个节点就把节点加入str字符串里面:str=str+String.valueOf(root.val);
然后来判断这个节点的左子树是否为空,如果不空的话,就访问左子树。
if(root.left!=null){
perm(root.left,str+"->");
}
这里也是理解代码的关键了。正如我前一篇递归算法文章所说,我们既然要在这个算法里使用递归算法,那么我们就要想好递归的算法是什么。在这里我们就把递归的算法看成:访问一个树的根节点,并输出他到达这个根节点的所有路径。知道这个办法之后我们就找最简单的例子来带,如果符合这个最简单的例子的话,那么对于所有的例子都符合了。
访问完左子树以后,就接着访问右子树。这时候在写明退出的条件即可。
问题:
关于在储存路径的问题上,我还是想了很久的。之前一直在函数里面创建一个str,不知道用形参来代替,这样str就可以记录你的路径。以后大家遇到记录上一次路径的问题的时候,可以用这个办法。
算法题还是得多练啊。加油!如果大家有什么算法题不会写的,非常欢迎和我讨论,谢谢。