二叉树的所有路径

关于二叉树的问题,我首先想到的就是递归的算法,因为二叉树的相关算法总会设计到回溯。

给定一个二叉树,返回所有从根节点到叶子节点的路径。

说明: 叶子节点是指没有子节点的节点。

这个题和我之前的写的那个爬楼梯的那个题有着相同的含义。同样是使用递归的算法。

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就可以记录你的路径。以后大家遇到记录上一次路径的问题的时候,可以用这个办法。

算法题还是得多练啊。加油!如果大家有什么算法题不会写的,非常欢迎和我讨论,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值