9.9算法练习

完全二叉树的节点个数

java 复制代码
public class countNodes {
    public class TreeNode {
     int val;
      TreeNode left;
      TreeNode right;
      TreeNode() {}
      TreeNode(int val) { this.val = val; }
      TreeNode(int val, TreeNode left, TreeNode right) {
          this.val = val;
          this.left = left;
          this.right = right;
      }
  }
  private int getHeight(TreeNode root){
        if (root==null){
            return 0;
        }
//树的总高度是由根节点和它的最高子树决定的
        return 1+getHeight(root.left);
  }
    public int countNodes(TreeNode root) {
if (root==null){
    return 0;
}
int leftHeight=getHeight(root.left);
int rightHeight=getHeight(root.right);
//如果左子树是二叉树
if (leftHeight==rightHeight){
    //左子树节点个数:2^h-1
    int leftNodes=(int)Math.pow(2,leftHeight)-1;
    //总节点个数:左子树节点个数+根节点+右子树节点个数(递归计算)
    return leftNodes+1+countNodes(root.right);
}else{
    //否则右子树是满二叉树(或者少一个节点),但我们可以认为他是完全二叉树的一部分
    //右子树节点个数
    int rightNodes=(int)Math.pow(2,rightHeight)-1;
    return rightNodes+1+countNodes(root.left);
}
    }
}

1、如果树为空(即root为null),则节点的个数为0。

2、否则,我们递归的计算左子树和右子树的节点个数。

3、在递归过程中,我们需要知道子数的高度,因为完全二叉树的节点个数和高度密切相关。

4、如果左子树的高度等于右子树的高度,那么左子树是一个满二叉树,节点个数可以直接通过公式2^h-1计算(其中h是左子树的高度)。

5、如果左子树的高度大于右子树的高度,那么右子树是一个满二叉树,并且左子树是一个不完全的完全二叉树,节点个数需要分别计算左子树和右子树后相加

  1. 使用递归计算左子树的高度 leftHeight 和右子树的高度 rightHeight。
  2. 如果 leftHeight==rightHeight,那么左子树是满二叉树,节点个数为 2leftHeight−1。
  3. 如果 leftHeight>rightHeight,那么右子树是满二叉树,节点个数为 2rightHeight−1,再加上左子树的节点个数(递归计算)。
  4. 最后,加上根节点 1

二分查找

复制代码
class Solution {
    public int search(int[] nums, int target) {
        int left=0;
        int right=nums.length-1;
        while(left<=right){
            int mid=left+(right-left)/2;
            if(nums[mid]>target){
                right=mid-1;
            }else if(nums[mid]<target){
                left=mid+1;
            }else{
                return mid;
        }
    }
    return -1;
    }
    }

寻找比目标字母大的最小字母

复制代码
class Solution {
     public char nextGreatestLetter(char[] letters, char target) {
        char result = letters[0];
        boolean found=false;
        for (char letter : letters) {
            if (letter>target){
                result =letter;
                found=true;
                break;
            }
        }
return result;
    }
}
相关推荐
Jasmine_llq1 分钟前
《P17462 [GESP202609 八级] 末班车》
算法·dijkstra 算法·最大化版本,求最长可行值·建反向图(逆图 / 反转边)·多源 dijkstra 思想·对每个终点单独跑一遍djst·离线预处理 + 在线查询
the3clipse1 小时前
H.265熵编码核心:CABAC自适应二进制算术编码详解——如何将语法元素高效压缩为比特流
人工智能·算法·视频编码·h.265·hevc·cabac·cavlc
CQU_JIAKE1 小时前
10.4【A】
算法
Godspeed Zhao1 小时前
现代智能雷达技术19——算法(5)
算法
(Charon)1 小时前
【C++面试】RAII到底是什么:从资源管理理解C++对象生命周期
c++·算法·面试
Omics Pro1 小时前
之江实验室NAR|虚拟细胞3阶段训练范式
数据库·人工智能·算法·机器学习·自然语言处理
Tisfy1 小时前
LeetCode 0678.有效的括号字符串:O(n)+O(1)一次遍历
算法·leetcode·字符串·题解·贪心·括号匹配
小O的算法实验室1 小时前
IEEE TEVC,学习辅助的搜索路径重构进化算法
学习·算法·重构
Liuchang09112 小时前
洛谷 P2670 [NOIP 2015 普及组] 扫雷游戏
c++·算法·游戏
言乐62 小时前
Python体现逻辑回归和决策树的区别
开发语言·python·算法·决策树·逻辑回归