完全二叉树的节点个数
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、如果左子树的高度大于右子树的高度,那么右子树是一个满二叉树,并且左子树是一个不完全的完全二叉树,节点个数需要分别计算左子树和右子树后相加
- 使用递归计算左子树的高度 leftHeight 和右子树的高度 rightHeight。
- 如果 leftHeight==rightHeight,那么左子树是满二叉树,节点个数为 2leftHeight−1。
- 如果 leftHeight>rightHeight,那么右子树是满二叉树,节点个数为 2rightHeight−1,再加上左子树的节点个数(递归计算)。
- 最后,加上根节点 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;
}
}