解题思路:第一种是直接全部都遍历一遍,第二种是用完全二叉树的特殊性,判断是不是满二叉树,来节省时间和空间复杂度
具体代码实现第二种如下:
class Solution {
private:
int getNodesNum(TreeNode* cur) {
int leftj=0;int rightj=0;
if(cur==NULL)return 0;
TreeNode*left=cur->left;
TreeNode*right=cur->right;
while(right){
right=right->right;
rightj++;
}
while(left){
left=left->left;
leftj++;
}if(leftj==rightj)return (2<<leftj)-1;
int leftNum=getNodesNum(cur->left);
int rightNum=getNodesNum(cur->right);
return leftNum+rightNum+1;
}
public:
int countNodes(TreeNode* root) {
return getNodesNum(root);
}
};
题目如下:
给你一棵 完全二叉树 的根节点 root
,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h
层,则该层包含 1~ 2h
个节点。
示例 1:
输入:root = [1,2,3,4,5,6] 输出:6
示例 2:
输入:root = [] 输出:0
示例 3:
输入:root = [1] 输出:1
提示:
- 树中节点的数目范围是
[0, 5 * 104]
0 <= Node.val <= 5 * 104
- 题目数据保证输入的树是 完全二叉树