题:
Given a complete binary tree, count the number of nodes.
Definition of a complete binary tree from Wikipedia:
In a complete binary tree every level, except possibly the last, is completely filled, and all nodes in the last level are as far left as possible. It can have between 1 and 2h nodes inclusive at the last level h.
tags: binary search
A 最直观的解法。dfs将树中每个节点都遍历并计数。时间复杂度O(N)。
但是超时了。
B tags是binary search。每一步,我们都可以确定左或者右子树的节点数。具体他,可以判断左右节点最最左边的层数是否相同,如果相同,则左子树为满二叉树,若不同则右子树为满二叉树。满二叉树的节点数容易计算,然后再递归地求解非满二叉树的节点数。
求解本题还要注意两点:
1)用<<代替pow(),算法能快100多ms。为啥快这么多?
2)在对子树递归时,将上次计算的树的高度用参数传入,避免不必要的计算。也能快上个几十ms。
class Solution {
public:
int countNodes(TreeNode*& root) {
return dfs(root, 0);
}
int dfs(TreeNode*& root, int l){
if(root==NULL) return 0;
int r = 0;
TreeNode* node = root->left;
if(l==0){
while(node!=NULL){
l++;
node = node->left;
}
}
node = root->right;
while(node!=NULL){
r++;
node = node->left;
}
if(l==r) return (1<<l)+dfs(root->right, r-1);
else return (1<<r)+dfs(root->left, l-1);
}
};