📅  最后修改于: 2023-12-03 15:39:55.516000             🧑  作者: Mango
UGC NET CS 2017年1月至2月的50号问题涉及到二叉树的节点计数问题。该问题可让程序员进一步了解二叉树的特性和算法优化。
给定一棵二叉树,需要计算节点的数量。如果二叉树为空,则节点数量为0。
二叉树的节点数可通过递归算法进行计算,该算法的时间复杂度为O(n),其中n表示节点数量。
/**
* 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 == NULL) {
return 0;
}
return 1 + countNodes(root->left) + countNodes(root->right);
}
};
该问题还有一种更加高效的算法,使用了完全二叉树的性质,其时间复杂度为O(logn*logn)。
代码片段如下:
class Solution {
public:
int countNodes(TreeNode* root) {
if (root == NULL) {
return 0;
}
int height = 0;
TreeNode *node = root;
while (node != NULL) {
height++;
node = node->left;
}
int left = 1 << (height - 1), right = (1 << height) - 1;
while (left < right) {
int mid = (right - left + 1) / 2 + left;
if (isExist(root, height, mid)) {
left = mid;
} else {
right = mid - 1;
}
}
return left;
}
bool isExist(TreeNode* root, int height, int k) {
int bit = 1 << (height - 2);
while (root != NULL && bit > 0) {
if (bit & k) {
root = root->right;
} else {
root = root->left;
}
bit >>= 1;
}
return root != NULL;
}
};
掌握二叉树节点计数的算法,能让程序员更深入理解二叉树。其中递归算法的时间复杂度较高,需要通过算法优化进行提高。