编写一个函数,统计给定二叉树的节点数量。
面试宝典
2023-06-12
Web前端开发工程师
41
```
/**
* 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 leftHeight = getHeight(root->left);
int rightHeight = getHeight(root->right);
if (leftHeight == rightHeight) {
// 左子树是满二叉树
return (1 << leftHeight) + countNodes(root->right);
} else {
// 右子树是满二叉树
return (1 << rightHeight) + countNodes(root->left);
}
}
private:
// 计算节点高度
int getHeight(TreeNode* node) {
int height = 0;
while (node) {
height++;
node = node->left;
}
return height;
}
};
```
算法思路:
1. 首先计算左子树高度和右子树高度。
2. 如果左子树高度等于右子树高度,说明左子树是满二叉树,而右子树可能不满,所以可以重复上述操作在右子树上进行。相反,如果右子树高度小于左子树,说明右子树是满的,重复上述操作在左子树上进行。
3. 如果当前节点为空,则返回 0,否则节点数应该是 1 + 左子树节点数 + 右子树节点数。
计算节点高度:
采用迭代方法计算二叉树高度,因为完全二叉树的特殊性,只需要不断地访问左节点就可以计算高度。
/**
* 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 leftHeight = getHeight(root->left);
int rightHeight = getHeight(root->right);
if (leftHeight == rightHeight) {
// 左子树是满二叉树
return (1 << leftHeight) + countNodes(root->right);
} else {
// 右子树是满二叉树
return (1 << rightHeight) + countNodes(root->left);
}
}
private:
// 计算节点高度
int getHeight(TreeNode* node) {
int height = 0;
while (node) {
height++;
node = node->left;
}
return height;
}
};
```
算法思路:
1. 首先计算左子树高度和右子树高度。
2. 如果左子树高度等于右子树高度,说明左子树是满二叉树,而右子树可能不满,所以可以重复上述操作在右子树上进行。相反,如果右子树高度小于左子树,说明右子树是满的,重复上述操作在左子树上进行。
3. 如果当前节点为空,则返回 0,否则节点数应该是 1 + 左子树节点数 + 右子树节点数。
计算节点高度:
采用迭代方法计算二叉树高度,因为完全二叉树的特殊性,只需要不断地访问左节点就可以计算高度。
相关文章
- PHP中如何处理文件上传和下载?
- PHP中常用的设计模式有哪些?
- 如何通过PHP来保护您的代码免受SQL注入攻击?
- 请问PHP中如何实现多线程?
- 请描述在Golang中使用MongoDB时的最佳实践。
- 请解释HTTP的基本概念,以及在Golang中如何使用HTTP?
- 如何在Golang中实现单例模式?
- 请举例说明PHP中如何处理异常?
- 聊一下高并发和高性能的区别和联系?
- 请解释下PHP中会话(session)和Cookie(cookie)的作用。
- 请提供至少三个通过PHP实现的网站性能优化技巧。
- 请谈谈您对PHP的垃圾回收机制的了解及实践。
- 请给一个例子解释一下PHP中的闭包函数是什么?
- 在PHP中,Magic Method都有哪些,并举例说明它们的作用?
- PHP中如何进行单元测试以及如何在开发过程中保证代码质量?
- 请列出与PHP相关的缓存机制及其优缺点。
- 请解释一下PHP中的MVC模式是如何工作的?
- PHP7和PHP5的性能上有什么差别?
- 请解释什么是defer语句,以及它有什么作用?
- 如何在Golang中进行并发编程?
微信收款码
支付宝收款码