给定一棵完全二叉树的头节点head,返回这棵树的节点个数。如果完全二叉树的节点数为N,请实现时间复杂度低于O(N)的解法。
#include <iostream>
using namespace std;
class TreeNode
{
public:
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int val) :val(val), left(NULL), right(NULL){}
};
class Solution
{
public:
TreeNode* InitTree(TreeNode* &root)
{
char ch = NULL;
cin >> ch;
if ('#' == ch)
{
root = NULL;
}
else
{
root = new TreeNode(atoi(&ch));
InitTree(root->left);
InitTree(root->right);
}
return root;
}
int GetAllTreeNode(TreeNode* root)
{
int allHeight = 0, rightHeight = 0;
int nodeCount = 0;
while (NULL != root)
{
allHeight = getHight(root);
rightHeight = getHight(root->right);
root = allHeight == rightHeight + 1 ? root->right : root->left;
nodeCount += (1 << rightHeight);
}
return nodeCount;
}
//计算完全二叉树的深度
int getHight(TreeNode* root)
{
TreeNode* p = root;
int count = 0;
while (NULL != p)
{
count++;
p = p->left;
}
return count;
}
};
int main()
{
TreeNode* root = NULL;
Solution s;
root = s.InitTree(root);
s.GetAllTreeNode(root);
return 0;
}