【树】257. 二叉树的所有路径

题目:

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

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

示例:

输入:

1
/ \
2 3
\
5

输出: ["1->2->5", "1->3"]

解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3

 

解答:

方法一:DFS

利用前序遍历,在递归栈中加入一个StringBuffer变量。使得二叉树的每个节点都有一个StringBuffer变量,记录从当前节点到根节点的路径。当当前节点是根节点时输出这个路径。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    List<String> res = new ArrayList<>();

    public List<String> binaryTreePaths(TreeNode root) {
        preOrder(root,"");

        return res;
    }

    public void preOrder(TreeNode root, String path){
        StringBuffer str = new StringBuffer(path);
        if(root == null) return;
        str.append(Integer.toString(root.val));

        if(root.left == null && root.right == null){
            res.add(str.toString());
        }
        else{
            str.append("->");
            preOrder(root.left,str.toString());
            preOrder(root.right,str.toString());
        }
    }
}

 

方法二:BFS

使用显示的队列。nodeQueue用来宽度遍历二叉树,pathQueue用来记录下当前节点到根节点的路径。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<String> binaryTreePaths(TreeNode root) {
        List<String> res = new ArrayList<>();

        if(root == null) return res;

        Queue<TreeNode> nodeQueue = new LinkedList<>();
        Queue<String> pathQueue = new LinkedList<>();
        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){
                res.add(path);
            }
            if(node.left != null){
                nodeQueue.offer(node.left);
                pathQueue.offer(new StringBuilder(path).append("->").append(Integer.toString(node.left.val)).toString());
            }
            if(node.right != null){
                nodeQueue.offer(node.right);
                pathQueue.offer(new StringBuilder(path).append("->").append(Integer.toString(node.right.val)).toString());
            }
        }
        
        return res;
    }
}

 

posted @ 2020-09-19 17:35  3KBLACK  阅读(111)  评论(0)    收藏  举报