代码随想录二刷第二十一天 | 222.完全二叉树的节点个数、110.平衡二叉树、257. 二叉树的所有路径、404. 左叶子之和、513.找树左下角的值

222.完全二叉树的节点个数

题目:222. 完全二叉树的节点个数 - 力扣(LeetCode)

题解:代码随想录

状态:AC

思路

可以用简单的前序递归遍历实现,也可以用完全二叉树的性质实现。

下面给出完全二叉树性质代码

代码

时间复杂度:O(logN × logN) 空间复杂度:O(logN)

java 复制代码
class Solution {
    public int countNodes(TreeNode root) {
        if(root == null) return 0;
        int leftDepth = 1, rightDepth = 1;
        TreeNode left = root.left, right = root.right;
        while(left != null){
            left = left.left;
            leftDepth++;
        }
        while(right != null){
            right = right.right;
            rightDepth++;
        }
        if(leftDepth == rightDepth){
            return (int) Math.pow(2, leftDepth) - 1;
        }
        return countNodes(root.left) + countNodes(root.right) + 1;
    }
}

110.平衡二叉树

题目:110. 平衡二叉树 - 力扣(LeetCode)

题解:代码随想录

状态:需要多复习

思路

平衡二叉树是左右子树高度不超过1

注意区分深度和高度,深度是从上往下,高度是从下往上

  1. 先求左右子树的高度,如果左右子树不为平衡二叉树,就返回-1
  2. 再对比左右子树高度差是否小于1,否则返回-1
  3. 父节点的高度 = 左右子树高度的最大值 + 1

代码

时间复杂度:O(N) 空间复杂度:O(N)

java 复制代码
class Solution {
    public boolean isBalanced(TreeNode root) {
        return getHeight(root) != -1;
    }
    
    private int getHeight(TreeNode node){
        if(node == null) return 0;
        int leftHeight = getHeight(node.left);
        if(leftHeight == -1) return -1;
        int rightHeight = getHeight(node.right);
        if(rightHeight == -1) return -1;
        if(Math.abs(leftHeight - rightHeight) > 1) return -1;
        return Math.max(leftHeight, rightHeight) + 1;
    }
}

257. 二叉树的所有路径

题目:257. 二叉树的所有路径 - 力扣(LeetCode)

题解:代码随想录

状态:AC

思路

简单的回溯题

代码

时间复杂度:O(N) 空间复杂度:O(N)

java 复制代码
class Solution {
    List<String> res = new ArrayList<>();
    public List<String> binaryTreePaths(TreeNode root) {
        func(root, "");
        return res;
    }
    private void func(TreeNode node, String str){
        if(node == null) return;
        if(node.left == null && node.right == null){
            res.add(str + node.val);
            return;
        }
        str += node.val + "->";
        func(node.left, str);
        func(node.right, str);
    }
}

404. 左叶子之和

题目:404. 左叶子之和 - 力扣(LeetCode)

题解:代码随想录

状态:取巧没想到

思路

如果该节点的左节点不为空,该节点的左节点的左节点为空,该节点的左节点的右节点为空,则找到了一个左叶子

代码

时间复杂度:O(N) 空间复杂度:O(N)

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

513.找树左下角的值

题目:513. 找树左下角的值 - 力扣(LeetCode)

题解:代码随想录

状态:AC

思路

层序遍历

代码

时间复杂度:O(N) 空间复杂度:O(N)

java 复制代码
class Solution {
    public int findBottomLeftValue(TreeNode root) {
        int res = 0;
        Deque<TreeNode> q = new LinkedList<>();
        q.offer(root);
        while(!q.isEmpty()){
            int size = q.size();
            res = q.peek().val;
            while(size > 0){
                TreeNode node = q.poll();
                if(node.left != null) q.offer(node.left);
                if(node.right != null) q.offer(node.right);
                size--;
            }
        }
        return res;
    }
}

112. 路径总和

题目:112. 路径总和 - 力扣(LeetCode)

题解:代码随想录

状态:AC

思路

回溯计算,注意考虑只有根节点的情况,并且只有到叶子节点的时候才判断和是否满足条件。

代码

时间复杂度:O(N) 空间复杂度:O(N)

java 复制代码
class Solution {
    public boolean hasPathSum(TreeNode root, int targetSum) {
         if(root == null) return false;
         return deal(root, targetSum, 0);
    }
    private boolean deal(TreeNode node, int targetSum, int sum){
         if(node == null) return false;
         sum += node.val;
         if(sum == targetSum && node.left == null && node.right == null) return true;
         return deal(node.left, targetSum, sum) || deal(node.right, targetSum, sum);
    }
}
相关推荐
空中海7 小时前
第二章:Maven进阶篇 — 依赖管理与构建生命周期
java·maven
xun-ming7 小时前
AI时代Java程序员自救手册
java·开发语言·人工智能
DavidSoCool7 小时前
GB28181 PTZCmd 完整指令对照表(8 位 16 进制)+ 详细注释 + 使用说明
java·sip·gb28181
张健11564096487 小时前
C++访问控制与友元
java·开发语言·c++
Sam_Deep_Thinking7 小时前
中小团队需要一个资源微服务
java·微服务·架构
Thanks_ks8 小时前
透过 Copy-On-Write 机制:理解并发编程中的性能与一致性权衡
java·多线程·并发编程·底层原理·写时复制·copyonwrite·性能优
一只幸运猫.8 小时前
JAVA后端面试题
java·开发语言
空中海8 小时前
第三章:Maven高级篇 — 插件开发与多模块工程
java·maven
秋98 小时前
TiDB 数据库全链路实战指南:从下载部署到 Java 高并发调优
java·数据库·tidb
JAVA面经实录9178 小时前
Java开发工程基础完整手册(企业实战完整版)
java·开发语言·git·ci/cd·svn·github·intellij idea