/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
#include< cmath > #用于pow()
#include< cstddef > #用于nullptr
#include< iostream > #用于cin cout
class Solution {
//满二叉树的节点数是 2的层数次方-1,如果是满二叉树就可以直接计算
//完全二叉树的子树也是完全二叉树,也就是说可以递归
//完全二叉树的子树至少有一个满二叉树
//如果左右子树层数相同则这个数就是满二叉树,如果左子树比右子树层数多则右子树一定是满二叉树
public:
int nodeNum(TreeNode* head) {
int L =0;
int R =0;
TreeNode* l;
TreeNode* r;
for(l=head; l != nullptr;l = l->left)L++;
for(r=head; r != nullptr; r = r->right)R++; //统计是不是满二叉树
if(L == R) return pow(2, L)-1; //是,则直接计算
return 1 + nodeNum(head->left) + nodeNum(head->right); //不是则继续求
}
};