给你一棵 完全二叉树 的根节点 root
,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h
层,则该层包含 1~ 2h
个节点。
题解:
1)层序遍历
2)可以利用完全二叉树的性质来做,完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。
对于情况一,可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。
对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算
class Solution {
public:
int countNodes(TreeNode* root) {
if(root==NULL) return 0;
TreeNode* left = root->left;
TreeNode* right = root->right;
int LeftDepth = 0;
int RightDepth = 0;
while(left){
left = left->left;
LeftDepth++;
}
while(right){
right = right->right;
RightDepth++;
}
if(LeftDepth == RightDepth){
return (2<<LeftDepth) - 1;
}
return countNodes(root-> right) + countNodes(root->left) + 1;
}
};
注意:
要充分利用二叉树的特性,也就是对遍历过程中的两种情况的处理,理解完全二叉树中满二叉树的情况,理解每次递归中+1的叠加。