代码随想录刷题Day21

47 阅读1分钟
  1. 110. 平衡二叉树
  • 我上来就是BFS

节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点

class Solution {
    public int sumOfLeftLeaves(TreeNode root) {
        Queue<TreeNode> queue = new ArrayDeque<>();
        if(root!=null){
            queue.add(root);
        }
        int sum=0;
        while(!queue.isEmpty()){
            int n=queue.size();
            for(int i=0;i<n;i++){
                TreeNode node = queue.poll();
                if(node.left!=null){
                    queue.add(node.left);
                    TreeNode tmp=node.left;
                    if(tmp.left==null&&tmp.right==null){//左叶子节点
                        sum+=tmp.val;
                    }   
                }
                if(node.right!=null){
                    queue.add(node.right);
                }
            }
        }
        return sum;
    }
}
  • dfs

判断是否为空树,
如果是空树,返回0;
如果不是空树,判断左孩子节点是否为左叶子节点
然后继续遍历左子树和右子树中的孩子节点,并把结果累加起来。

    int sum=0;
    public int sumOfLeftLeaves(TreeNode root) {
        dfs(root);
        return sum;
    }
    public void dfs(TreeNode root){
        if(root==null){
            return;
        }
        if(root.left!=null&&root.left.left==null&&root.left.right==null){
            sum+=root.left.val;
        }
        dfs(root.left);
        dfs(root.right);
    }
}
  1. 513. 找树左下角的值
  • bfs YYDS
    public int findBottomLeftValue(TreeNode root) {
        Queue<TreeNode> queue = new ArrayDeque<>();
        if(root!=null){
            queue.add(root);
        }
        int res=0;
        while(!queue.isEmpty()){
            int n=queue.size();
            for(int i=0;i<n;i++){
                TreeNode node = queue.poll();
                if(i==0){// 记录最后一行第一个元素
                    res=node.val;
                }
                if(node.left!=null){
                    queue.add(node.left);
                }
                if(node.right!=null){
                    queue.add(node.right);
                }
            }
        }
        return res;
    }
}
  • dfs(每次递归都要看答案。。。
    int maxDepth=0,res;
    public int findBottomLeftValue(TreeNode root) {
        dfs(root,1);
        return res;
    }
    public void dfs(TreeNode root,int depth){
        if(root==null){
            return;
        }
        //每次第一次搜索到当前深度 depth 且 depth > maxDepth 的时候,必然是当前深度的最左节点,此时用当前节点值更新res
        if(depth>maxDepth){
            maxDepth=depth;
            res=root.val;
        }
        dfs(root.left,depth+1);
        dfs(root.right,depth+1);
    }
}