二叉树刷题篇 完全二叉树的节点个数
Posted 归宅观察部
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树刷题篇 完全二叉树的节点个数相关的知识,希望对你有一定的参考价值。
222. 完全二叉树的节点个数
给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
https://leetcode-cn.com/problems/count-complete-tree-nodes/
完全二叉树
那么,遍历二叉树的套路我们已经熟悉了,要么递归,要么迭代,递归使用后序遍历(左->右->中),迭代使用栈或者队列进行层序遍历。
class Solution {
private:
int getNodesNum(TreeNode* cur) {
if (cur == 0) return 0;
int leftNum = getNodesNum(cur->left); // 左
int rightNum = getNodesNum(cur->right); // 右
int treeNum = leftNum + rightNum + 1; // 中
return treeNum;
}
public:
int countNodes(TreeNode* root) {
return getNodesNum(root);
}
};
//代码来自公众号 代码随想录 作者为Carl
class Solution {
public:
int countNodes(TreeNode* root) {
queue<TreeNode*> que;
if (root != NULL) que.push(root);
int result = 0;
while (!que.empty()) {
int size = que.size();
for (int i = 0; i < size; i++) {
TreeNode* node = que.front();
que.pop();
result++; // 记录节点数量
if (node->left) que.push(node->left);
if (node->right) que.push(node->right);
}
}
return result;
}
};
//代码来自公众号 代码随想录 作者为Carl
class Solution {
public:
int countNodes(TreeNode* root) {
if (root == nullptr) return 0;
TreeNode* left = root->left;
TreeNode* right = root->right;
int leftHeight = 0, rightHeight = 0; // 这里初始为0是有目的的,为了下面求指数方便
while (left) { // 求左子树深度
left = left->left;
leftHeight++;
}
while (right) { // 求右子树深度
right = right->right;
rightHeight++;
}
if (leftHeight == rightHeight) {
return (2 << leftHeight) - 1; // 注意(2<<1) 相当于2^2,所以leftHeight初始为0
}
return countNodes(root->left) + countNodes(root->right) + 1;
}
};
作者:carlsun-2
链接:https://leetcode-cn.com/problems/count-complete-tree-nodes/solution/222-pu-tong-er-cha-shu-yu-wan-quan-er-cha-shu-qi-2/
以上是关于二叉树刷题篇 完全二叉树的节点个数的主要内容,如果未能解决你的问题,请参考以下文章