思路:
递归,判断是否是满二叉树,利用满二叉树的性质。
是满二叉树就快速计算,不是就递归经典左右中递归去算即可。
左右中递归可以精简的,也是很经典,用了好几次。这个调用自身的精简版要记住
迭代法就用层序直接搜索即可。
储备:
1、判断完全二叉树是否是满二叉树:递归左右孩子看深度是否相等。
首先完全一定是最后一层的中间全部有节点。只要看最后一层有没有到最后一个(最右边的节点)。有的话就是满二叉树,没有就是不满的完全二叉树
那么只要看最后一层的第一个(即最左结点,很方便递归)和最后一层的最后一个(最右节点)深度是否相等。
2、左移右移的运算优先级低于加减乘除
位运算基本运算符,优先级,运算律,高级操作,以及具体应用_运算符优先级 位运算-优快云博客
问题:
1、精简递归就是左右中的逻辑。记住即可。
class Solution {
public:
int countNodes(TreeNode* root) {//基础递归版
// if (root==nullptr) return 0;
// int ln=countNodes(root->left);//左
// int rn=countNodes(root->right);//右
// int sum=ln+rn+1;//中
// return sum;
if (root==nullptr) return 0;//精简递归版
return countNodes(root->left)+countNodes(root->right)+1;//左右中
}
};
2、
最后:
基础递归版:
class Solution {
public:
int countNodes(TreeNode* root) {//基础递归版
// if (root==nullptr) return 0;
// int ln=countNodes(root->left);//左
// int rn=countNodes(root->right);//右
// int sum=ln+rn+1;//中
// return sum;
if (root==nullptr) return 0;//精简递归版
return countNodes(root->left)+countNodes(root->right)+1;//左右中
}
};
基础层序遍历版:
class Solution {
public:
int countNodes(TreeNode* root) {//基础层序遍历版
queue<TreeNode*> que;
if (root) que.push(root);
int cnt=0;
while (!que.empty()) {
int sz=que.size();
for (int i=0;i<sz;i++) {
TreeNode* cur=que.front();
que.pop();
cnt++;
if (cur->left) que.push(cur->left);
if (cur->right) que.push(cur->right);
}
}
return cnt;
}
};
递归速算版:
class Solution {
public:
int countNodes(TreeNode* root) {//精简递归速算版
if (root==nullptr) return 0;
//判断是否满二叉
int lh=1,rh=1;//已有了一层root
TreeNode* l=root->left;
TreeNode* r=root->right;
while (l) {//递归左子树
lh++;
l=l->left;
}
while (r) {//递归右子树
rh++;
r=r->right;
}
if (lh==rh) return (2<<lh-1)-1;//是满二叉则速算.左移1比直接1多了1倍。故要减1
//不是满二叉就硬算暴力算(会局部判断是否是满二叉,加速了计算)
return countNodes(root->left)+countNodes(root->right)+1;//左右中
}
};

549

被折叠的 条评论
为什么被折叠?



