力扣257题(二叉树的所有路径)

257、二叉树的所有路径

具体实现:

 

1.递归函数参数和返回值

参数:根节点,记录每一条路径的path,存放结果集的result

返回值:无

2.递归终止条件

遍历到叶子节点,也就是这个节点没有左孩子和右孩子时

path来记录路径

res存放结果

    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;
        }

 

3.单层递归逻辑

     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);
        }

 

代码:

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);
        }
    }
}

 

 

 

 

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;
    }
}

 

 

 

 

posted @ 2021-11-09 21:44  最近饭吃的很多  阅读(29)  评论(0编辑  收藏  举报