【leetcode】每日精选题详解之257. 二叉树的所有路径

        嗨,大家好,我是袁厨(因为酷爱做饭,所以自己考取了厨师证)。之前一直看大家写的博客,学到了很多东西。然后最近萌生了自己写的想法,将自己知道的分享给需要的同学。以后每天会为大家分享leetcode精选题目的各种题解和Python, JS, JQ, CSS, PHP, JAVA的一些小Demo。请大家关注我,一起交流学习吧。


题目描述

在这里插入图片描述


递归法(DFS)

做题思路

这个题目看似挺难解决,实则和之前做的递归一样,我们还是按照递归三部曲来,但是我们需要首先创建一个动态字符数组用来存路径。
递归三要素:
(1)确定递归函数的参数和返回值
(2)确定终止条件
(3)确定单层递归的逻辑(不要想太多,只需把单层的相通即可,然后进行递归)
(1)那么我们的参数则是用来存储路径的数组,节点,以及每个路径的字符串。
(2)终止条件则为左右节点为空的情况
(3)单层递归逻辑,则是把路径的值用->连接起来。

题目代码

class Solution {
    
    
    public List<String> binaryTreePaths(TreeNode root) {
    
    
       //构建一个动态字符串数组
        List<String> array = new ArrayList<>();
        //传入的值
        bfs(root,"",array);
        return array;
    }
    public void bfs(TreeNode root,String road,List<String> array){
    
    
        //为空的情况
        if(root == null){
    
    
            return;
        }
        //叶子节点
        if(root.left == null && root.right == null){
    
    
            array.add(road+root.val);
            return;
        }else{
    
    
            //单层递归逻辑,通过->进行连接
            bfs(root.left,road+root.val+"->",array);
            bfs(root.right,road+root.val+"->",array);
        }
    }
}

        


递归法

做题思路

这个做题思路是跟别人学的,代码很简单但是不是特别容易理解,大家可以参考一下,总的来说就是先找出左路径,然后再找出右路径,不如上一个递归方法容易理解。参考链接

题目代码

 public List<String> binaryTreePaths(TreeNode root) {
    
    
        List<String> res = new LinkedList<>();
        if (root == null)
            return res;
        //到达叶子节点,把路径加入到集合中
        if (root.left == null && root.right == null) {
    
    
            res.add(root.val + "");
            return res;
        }
        //遍历左子节点的路径
        for (String path : binaryTreePaths(root.left)) {
    
    
            res.add(root.val + "->" + path);
        }
        //遍历右子节点的路径
        for (String path : binaryTreePaths(root.right)) {
    
    
            res.add(root.val + "->" + path);
        }
        return res;
    }

广度优先搜索(队列)

做题思路

这个解题方法是基于广度优先搜索的解题方法。广度优先搜索是最容易理解的方法,他的概念就是将树一层一层的遍历,然后出队的时候,不断与之前的节点进行连接,分成很多条,然后当某个路径为叶子节点时将该路径保存到ArrayList中。

题目代码

class Solution {
    
    
    public List<String> binaryTreePaths(TreeNode root) {
    
    
        List<String> res = new ArrayList<>();
        if (root == null)
            return res;
         //创建一个队列
        Queue<Object> queue = new LinkedList<>();
        queue.add(root);
        queue.add(root.val + "");
        while (!queue.isEmpty()) {
    
    
             //出列
            TreeNode node = (TreeNode) queue.poll();
            String road = (String) queue.poll();
            //如果到叶子节点,说明找到了一条完整路径
            if (node.left == null && node.right == null) {
    
    
                res.add(road);
            }

            //右子节点不为空就把右子节点和路径存放到队列中
            if (node.right != null) {
    
    
                queue.add(node.right);
                //注意这里,是要将road添加过来,这样才能分开路径
                queue.add(road + "->" + node.right.val);
            }

            //左子节点不为空就把左子节点和路径存放到队列中
            if (node.left != null) {
    
    
                queue.add(node.left);
                //同上
                queue.add(road + "->" + node.left.val);
            }
        }
        return res;
    }
}

总结

这个题目的解法还是挺多的,是一个很不错的题目,大家可以参考一下,假期马上就要结束了,大家好好玩昂。

作者:LeetCode
链接:https://leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

猜你喜欢

转载自blog.csdn.net/tan45du_yuan/article/details/108943063
今日推荐