104.二叉树的最大深度
思路:
代码:
class Solution {
public int maxDepth(TreeNode root) {
if(root == null){
return 0;
}
int leftDepth = maxDepth(root.left);
int rightDepth = maxDepth(root.right);
return Math.max(leftDepth, rightDepth) + 1;
}
}
需要注意的点:
1、最后返回值需要+1,根节点也要算上。
111.二叉树的最小深度
思路:
代码:
class Solution {
public int minDepth(TreeNode root) {
if(root == null) return 0;
int minleft = minDepth(root.left);
int minright = minDepth(root.right);
if(root.left == null){//如果没有左子树,其左面的最小长度不能算
return minright + 1;
}
if(root.right == null){//右子树同理
return minleft + 1;
}
return Math.min(minleft, minright) + 1;
}
}
需要注意的点:
见注释。
222.完全二叉树的节点个数
思路:
代码:
class Solution {
public int countNodes(TreeNode root) {
if(root == null) return 0;
TreeNode left = root.left;
TreeNode right = root.right;
int leftdepth = 0, rightdepth = 0;
while(left != null){
left = left.left;
leftdepth++;
}
while(right != null){
right = right.right;
rightdepth++;
}
if(leftdepth == rightdepth){//利用完全二叉树特性,如果从某节点起是满二叉树,直接返回其值:2^深度-1
return (2 << leftdepth) - 1;//利用位运算
}
return countNodes(root.left) + countNodes(root.right) + 1;//此处返回值不能用left或right,经过前面的步骤left(right)已经变了
}
}
直接计算,没有利用完全(满)二叉树特性
class Solution {
public int countNodes(TreeNode root) {
if(root == null) return 0;
return countNodes(root.left) + countNodes(root.right) + 1;
}
}
需要注意的点:
1、利用满二叉树节点可以直接计算(无需)遍历的特点,额外设置终止条件。