1. 题目来源
2. 题目说明
3. 题目解析
方法一:bfs
。。。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int countNodes(TreeNode* root) {
if (!root) return 0;
int res = 1;
queue<TreeNode*> q;
q.push(root);
while (q.size()) {
int len = q.size();
for (int i = 0; i < len; ++i) {
auto t = q.front();
q.pop();
if (t->left) q.push(t->left), ++res;
if (t->right) q.push(t->right), ++res;
}
}
return res;
}
};
方法二:dfs
。。。
代码:
class Solution {
public:
int countNodes(TreeNode* root) {
if (!root) return 0;
return countNodes(root->left) + countNodes(root->right) + 1;
}
};
方法二:二分
首先完全二叉树和满二叉树的性质请自行百度。
思路:
- 是满二叉树: 在完全二叉树基础上,如果从根节点一直走左孩子得到树高度,和从根节点一直走右孩子得到树高度一样的话,该完全二叉树就是一颗满二叉树。那么直接返回 2 n − 1 2^n-1 2n−1 即可
- 不是满二叉树: 有两种情况:
- 若左子树和右子树都是满二叉树,则直接计算即可
- 若左子树和右子树其中之一不是满二叉树,则计算满二叉树一边,另一边递归处理即可
- 注意: 左右子树都是满二叉树的话,那么最后一层节点分界点就刚好在中间位置。否则,分界点在左侧、右侧,都会造成左子树、右子树不为满二叉树的情况
画图很好理解。
树上的二分,挺不错的一道题目。
总共二分 l o g n logn logn 次,每次判断当前树高度,是 l o g n logn logn,所有总的时间复杂度是 O ( l o g n 2 ) O(log^2_n) O(logn2)
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int countNodes(TreeNode* root) {
if (!root) return 0;
auto l = root->left, r = root->right;
int x = 1, y = 1;
while (l) l = l->left, x ++;
while (r) r = r->right, y ++;
if (x == y) return (1 << x) - 1;
return countNodes(root->left) + 1 + countNodes(root->right);
}
};