• 【LeetCode-257】二叉树的所有路径


    8.11 二叉树的所有路径

    8.11.1 题目描述

    给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

    叶子节点 是指没有子节点的节点。
    在这里插入图片描述

    8.11.2 方法一:深度优先搜索

    思路与算法

    最直观的方法是使用深度优先搜索。在深度优先搜索遍历二叉树时,我们需要考虑当前的节点以及它的孩子节点。

    • 如果当前节点不是叶子节点,则在当前的路径末尾添加该节点,并继续递归遍历该节点的每一个孩子节点。
    • 如果当前节点是叶子节点,则在当前路径末尾添加该节点后我们就得到了一条从根节点到叶子节点的路径,将该路径加入到答案即可。

    如此,当遍历完整棵二叉树以后我们就得到了所有从根节点到叶子节点的路径。当然,深度优先搜索也可以使用非递归的方式实现,这里不再赘述。

    代码

    class Solution {
        public List<String> binaryTreePaths(TreeNode root) {
            List<String> paths = new ArrayList<String>();
            constructPaths(root, "", paths);
            return paths;
        }
    
        public void constructPaths(TreeNode root, String path, List<String> paths) {
            if (root != null) {
                StringBuffer pathSB = new StringBuffer(path);
                pathSB.append(Integer.toString(root.val));
                if (root.left == null && root.right == null) {  // 当前节点是叶子节点
                    paths.add(pathSB.toString());  // 把路径加入到答案中
                } else {
                    pathSB.append("->");  // 当前节点不是叶子节点,继续递归遍历
                    constructPaths(root.left, pathSB.toString(), paths);
                    constructPaths(root.right, pathSB.toString(), paths);
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    复杂度分析

    在这里插入图片描述

    8.11.3 方法二:广度优先搜索

    思路与算法

    我们也可以用广度优先搜索来实现。我们维护一个队列,存储节点以及根到该节点的路径。一开始这个队列里只有根节点。在每一步迭代中,我们取出队列中的首节点,如果它是叶子节点,则将它对应的路径加入到答案中。如果它不是叶子节点,则将它的所有孩子节点加入到队列的末尾。当队列为空时广度优先搜索结束,我们即能得到答案。

    代码

    class Solution {
        public List<String> binaryTreePaths(TreeNode root) {
            List<String> paths = new ArrayList<String>();
            if (root == null) {
                return paths;
            }
            Queue<TreeNode> nodeQueue = new LinkedList<TreeNode>();
            Queue<String> pathQueue = new LinkedList<String>();
    
            nodeQueue.offer(root);
            pathQueue.offer(Integer.toString(root.val));
    
            while (!nodeQueue.isEmpty()) {
                TreeNode node = nodeQueue.poll(); 
                String path = pathQueue.poll();
    
                if (node.left == null && node.right == null) {
                    paths.add(path);
                } else {
                    if (node.left != null) {
                        nodeQueue.offer(node.left);
                        pathQueue.offer(new StringBuffer(path).append("-			 >").append(node.left.val).toString());
                    }
    
                    if (node.right != null) {
                        nodeQueue.offer(node.right);
                        pathQueue.offer(new StringBuffer(path).append("-  	>").append(node.right.val).toString());
                    }
                }
            }
            return paths;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    复杂度分析

    • 时间复杂度: O ( N 2 ) O(N^2) O(N2),其中 N 表示节点数目。分析同方法一。
    • 空间复杂度: O ( N 2 ) O(N^2) O(N2),其中 N 表示节点数目。在最坏情况下,队列中会存在 N 个节点,保存字符串的队列中每个节点的最大长度为 N,故空间复杂度为 O ( N 2 ) O(N^2) O(N2)

    8.11.4 my answer—深度优先搜索

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode() {}
     *     TreeNode(int val) { this.val = val; }
     *     TreeNode(int val, TreeNode left, TreeNode right) {
     *         this.val = val;
     *         this.left = left;
     *         this.right = right;
     *     }
     * }
     */
    class Solution {
        List<String> ans  = new ArrayList<>();
        static StringBuilder stringBuilder = new StringBuilder();
        public List<String> binaryTreePaths(TreeNode root) {
            if(root == null)return null;
            getPaths(root,stringBuilder);
            return ans;
        }
        
        public void getPaths(TreeNode node,StringBuilder stringBuilder){
            StringBuilder stringBuilder2 = new StringBuilder(stringBuilder);
            if(node != null){
                if(node.left != null || node.right != null){
                    stringBuilder2.append(node.val + "->");
                    getPaths(node.left,stringBuilder2);
                    getPaths(node.right,stringBuilder2);
                }else{
                    stringBuilder2.append(node.val);
                    ans.add(stringBuilder2.toString());
                }
            }
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
  • 相关阅读:
    amd羿龙CPU A320系列主板如何安装win7
    Java题目详解——牛客网JZ31.栈的压入,弹出序列
    【JavaScript】axios
    载紫杉醇D-α-生育酚聚乙二醇1000琥珀酸酯/纳米粒包裹紫杉醇的肝素纳米粒
    Python 基于 urllib 使用 Handler 处理器(代理)
    在面试提问环节应该问那些内容
    IO多路复用 Linux C Server-Client 多用户聊天系统
    第三次CCF计算机软件能力认证
    vmware的Linux虚拟机创建新的卷组VG
    会议OA(会议排座&送审)
  • 原文地址:https://blog.csdn.net/xiaoguanglin/article/details/126757584