/** * 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); //不是则继续求 } };