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 2hnodes inclusive at the last level h.
代码一适合任何形式的二叉树,代码二和代码三只适合本题所述形式的二叉树。
代码一:最简单,但时间超限
int countNodes(TreeNode* root)
{
if(NULL==root)
return 0;
int count(0);
count=1+countNodes(root->left)+countNodes(root->right);
return count;
}
代码二:采用层序遍历的方式,统计层数和最后一层结点个数,还是时间超限
<pre name="code" class="cpp">int countNodes(TreeNode* root)
{
queue<TreeNode*> nodes;
if(NULL==root)
return 0;
nodes.push(root);
int depth(1);
int result(0);
while(!nodes.empty())
{
int length=nodes.size();
int i=0;
int k(0);
while(i<length)
{
TreeNode* tmpNode=nodes.front();
nodes.pop();
if(tmpNode->left)
{
nodes.push(tmpNode->left);
k++;
}
else
break;
if(tmpNode->right)
{
nodes.push(tmpNode->right);
k++;
}
else
break;
i++;
}
if(i<length)
{
result=(1<<depth)-1+k;
break;
}
depth++;
}
return result;
}
代码三:在代码一上的扩展,在网上看别人的。因为是完全二叉树,所以有且仅有最后一层和倒数第二层有叶子结点。首先统计最左边和最右边的深度,如果深度一致,说明是满二叉树(注意题目条件),则可以直接求出;如果不一致,则分别求左右孩子结点的结点个数。
<pre name="code" class="cpp">/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int countNodes(TreeNode* root) {
if(NULL==root)
return 0;
int height1(0),height2(0);
TreeNode* p=root;
while(p)
{
p=p->left;
height1++;
}
TreeNode* q=root;
while(q)
{
q=q->right;
height2++;
}
if(height1==height2)
return (1<<height1)-1;
return 1+countNodes(root->left)+countNodes(root->right);
}
};