Day15 | 257二叉树的所有路径&404左叶子之和&513找树左下角的值

65 阅读1分钟

二叉树的所有路径 LeetCode 257

题目链接:[LeetCode 257 - 简单]

思路

从路径上看到需要使用回溯 从返回从根节点到叶子节点可以看出终止条件为判断该节点是否为叶子节点

回溯+递归:

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);//回溯
        }
    }
}

左叶子之和 LeetCode 404

题目链接:[LeetCode 404 - 简单]

思路

如何判断左叶子节点:root.left!=null && root.left.left==null && root.left.right==null

如何计算右子树的左叶子节点:

int left = sumOfLeftLeaves(root.left);

int right = sumOfLeftLeaves(root.right);

递归:

class Solution {
    public int sumOfLeftLeaves(TreeNode root) {
        if(root==null)return 0;
        int left = sumOfLeftLeaves(root.left);
        int right = sumOfLeftLeaves(root.right);
        int mid = 0;
        if(root.left!=null && root.left.left==null && root.left.right==null){
            mid = root.left.val;
        }
        int sum = left + right + mid;
        return sum;
    }
}

层序遍历:

class Solution {
    public int sumOfLeftLeaves(TreeNode root) {
        if(root==null)return 0;
        Queue<TreeNode> que = new LinkedList<>();
        int sum = 0;
        que.offer(root);
        while(!que.isEmpty()){
            int len = que.size();
            while(len>0){
                TreeNode node = que.poll();
                if(node.left!=null && node.left.left==null && node.left.right==null){
                    sum += node.left.val;
                }
                len--;
                if(node.left!=null) que.offer(node.left);
                if(node.right!=null) que.offer(node.right);
            }
        }
        return sum;
    }
}

找树左下角的值 LeetCode 513

题目链接:[LeetCode 513 - 中等]

思路

使用层序遍历,每一层都获取其第一个节点的值。

层序遍历:

class Solution {
    public int findBottomLeftValue(TreeNode root) {
        Queue<TreeNode> que = new LinkedList<>();
        que.offer(root);
        int left = root.val;
        while(!que.isEmpty()){
            int len = que.size();
            for(int i=len;i>0;i--){
                TreeNode node = que.poll();
                if(len==i){
                    left=node.val;
                }
                if(node.left!=null) que.offer(node.left);
                if(node.right!=null) que.offer(node.right);
            }
        }
        return left;
    }
}

思考

改进:

class Solution {
    public int findBottomLeftValue(TreeNode root) {
        Deque<TreeNode> queue = new ArrayDeque<>();
        queue.add(root);
        TreeNode out = new TreeNode() ;;
        while (!queue.isEmpty()){
            int len = queue.size();
            out = queue.peek();
            while (len>0){
                TreeNode temp = queue.poll();
                if (temp.left!=null) queue.add(temp.left);
                if (temp.right!=null) queue.add(temp.right);
                len--;
            }

        }
        return out.val;
    }
}