题目描述
给出一个完全二叉树,求出该树的节点个数。
说明:
完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
示例:
输入:
1
/ \
2 3
/ \ /
4 5 6
输出: 6
思路
要充分利用题目已知条件:完全二叉树!
完全二叉树是由很多个满二叉树组成的,任意一个结点的左右子数必有一个是满二叉树,而满二叉树的结点个数是很好求的,为2^高度-1,故以次来做递归遍历所有结点,直到求得最后结果。
代码中lr代表左子树的高度,rh代表右子数的高度,求它是为了求子树结点个数,若该子数是满二叉树,count = 2^h - 1;若该子数不是满二叉树,则count = 1 + 左子树结点个数 + 右子数结点个数。
代码
/**
* 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 (!root)
return 0;
int lh = 0;
int rh = 0;
int count = 0;
TreeNode *p = root, *q = root;
while(p){
++lh;
p = p->left;
}
while(q){
++rh;
q = q->right;
}
if(lh == rh){
count = (1 << lh) - 1;
}else{
count = 1 + countNodes(root->left) + countNodes(root->right);
}
return count;
}
};