leetcode_树_257. 二叉树的所有路径(#)

大家好,我是被白菜拱的猪。

一个热爱学习废寝忘食头悬梁锥刺股,痴迷于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());
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44226263/article/details/109345528
今日推荐