Java实现leetcode--257.二叉树的所有路径。

看到这个题之后思考了许久,然后想到层次遍历,灵光一闪,似乎好像可以,直接开干。

看了许多题解,感觉我自己的这种思想还挺新颖的,时间复杂度的话只遍历了一遍,取值也是以下标形式取址的。所以整体应该是O(N)的复杂度吧。然后除了遍历用的队列,以及结果集所需的List集合,也没有额外的开销了。emm自我感觉还不错,记录下来,与君共享。

class Solution {
    public List<String> binaryTreePaths(TreeNode root) {
        List<String> result = new ArrayList<>(); //用来记录返回的结果集
        if(root != null){
            Queue<TreeNode> queue = new LinkedList<>();//这个队列用来做二叉树的层序遍历。
            queue.offer(root);//头节点入队。

            String temp = String.valueOf(root.val); //记录下此时的节点信息,因为它是结果的一部分,接下来后面增加节点的时候就需要在这个基础上进行累加。
            result.add(temp);//加入结果集。
            root.val = 0; // 记录下这个部分所在结果集的下标。因为这个原本的数字我已经记录下来了,这个变量就直接被我复用了。

            while(!queue.isEmpty()){
                int len = queue.size();//每一层的节点数
                while(len != 0){//在这一层内进行遍历。
                    
                    TreeNode cur = queue.poll();
                    temp = result.get(cur.val);

                    if(cur.left != null){
                        queue.offer(cur.left);
                        
                        result.set(cur.val,temp + "->" + cur.left.val);//将原本的结果集的数据进行增加,因为它有孩子。
                        cur.left.val = cur.val;//同样记录下这个部分所在的结果集的下标。
                        cur.val = result.size();//为下一步做准备,如果它还有一个孩子的话,就需要在结果集上加一条数据了。
                    }
                    if(cur.right != null){
                        queue.offer(cur.right);
                        
                        if(cur.val == result.size()){//果不其然还有一个孩子,加一条数据。
                            result.add(new String());
                        }
                        result.set(cur.val,temp + "->" + cur.right.val);//对这条数据进行一个拼接,加上这个孩子。
                        cur.right.val = cur.val;//同样记录这天数据所在结果集的下标。
                    }
                    len--;
                }
            }
        }
        return result;
    }
}

另外再附上代码随想录上看的两种解法:

迭代法:

class Solution {
    /**
     * 迭代法
     */
    public List<String> binaryTreePaths(TreeNode root) {
        List<String> result = new ArrayList<>();
        if (root == null)
            return result;
        Stack<Object> stack = new Stack<>();
        // 节点和路径同时入栈
        stack.push(root);
        stack.push(root.val + "");
        while (!stack.isEmpty()) {
            // 节点和路径同时出栈
            String path = (String) stack.pop();
            TreeNode node = (TreeNode) stack.pop();
            // 若找到叶子节点
            if (node.left == null && node.right == null) {
                result.add(path);
            }
            //右子节点不为空
            if (node.right != null) {
                stack.push(node.right);
                stack.push(path + "->" + node.right.val);
            }
            //左子节点不为空
            if (node.left != null) {
                stack.push(node.left);
                stack.push(path + "->" + node.left.val);
            }
        }
        return result;
    }
}

递归法:

class Solution {
    /**
     * 递归法
     */
    public List<String> binaryTreePaths(TreeNode root) {
        List<String> res = new ArrayList<>();
        if (root == null) {
            return res;
        }
        List<Integer> paths = new ArrayList<>();
        traversal(root, paths, res);
        return res;
    }

    private void traversal(TreeNode root, List<Integer> paths, List<String> res) {
        paths.add(root.val);
        // 叶子结点
        if (root.left == null && root.right == null) {
            // 输出
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < paths.size() - 1; i++) {
                sb.append(paths.get(i)).append("->");
            }
            sb.append(paths.get(paths.size() - 1));
            res.add(sb.toString());
            return;
        }
        if (root.left != null) {
            traversal(root.left, paths, res);
            paths.remove(paths.size() - 1);// 回溯
        }
        if (root.right != null) {
            traversal(root.right, paths, res);
            paths.remove(paths.size() - 1);// 回溯
        }
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小黑cc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值