完全二叉树的性质为:
1.h层的完全二叉树的节点个数为
2
h
−
1
2^h-1
2h−1
2.向左遍历和向右遍历的深度相同,就是左臂和右臂一样长
基于上述性质写出代码:
class Solution {
public:
int traversal(TreeNode* cur){
if(cur == nullptr) return 0;
//如果子树是完全二叉树,走如下逻辑
TreeNode* left = cur->left;
TreeNode* right = cur->right;
int l_dept = 0,r_dept = 0;
while(left){
left = left->left;
l_dept++;
}
while(right){
right = right->right;
r_dept++;
}
if(l_dept == r_dept){
return (2<<l_dept)-1;
}
//如果子树不是完全二叉树就走正常的逻辑
int l_num = traversal(cur->left);
int r_num = traversal(cur->right);
return l_num+r_num+1;
}
int countNodes(TreeNode* root) {
return traversal(root);
}
};