1.满二叉树、完全二叉树
222. 完全二叉树的节点个数
1.题目分析
-
1.普通树的节点数需要递归遍历全部的,所以复杂度为N
-
2.满二叉树只需要求出树深度h,再用公式:深度 = 2^h - 1 即可,时间复杂度:logN
-
while(root!=null){ root = root.left h++; // 算出深度即可 }
-
-
3.完全二叉树则可以借鉴二者合体,时间复杂度:logN * logN
- 因为root根节点的有一棵子树一定是满的,会停止递归;
- 算法的递归深度就是树高logN,每次递归花费时间最多是logN,所以时间复杂度为logN * logN;
2.代码
class Solution {
public int countNodes(TreeNode root) {
int hL = 0;
int hR = 0;
TreeNode left = root;
while (left != null){
left = left.left;
hL++;
}
TreeNode right = root;
while (right != null){
right = right.right;
hR++;
}
此时说明是满二叉树,可以用公式
if (hL == hR){
return (int)Math.pow(2,hL) - 1;
}
否则,继续递归 当前节点root + 左子树节点数 + 右子树节点数
return 1 + countNodes(root.left) + countNodes(root.right);
}
}