【LeetCode-树】完全二叉树的节点个数

题目描述#

给出一个完全二叉树,求出该树的节点个数。
说明:
完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1 ~ 2^h 个节点。
示例:

Copy
输入: 1 / \ 2 3 / \ / 4 5 6 输出: 6

题目链接: https://leetcode-cn.com/problems/count-complete-tree-nodes/

思路1#

使用 dfs。代码如下:

Copy
/** * 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==nullptr) return 0; return countNodes(root->left)+countNodes(root->right)+1; } };

思路2#

使用bfs。代码如下:

Copy
/** * 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==nullptr) return 0; queue<TreeNode*> q; q.push(root); int cnt = 0; while(!q.empty()){ TreeNode* node = q.front(); q.pop(); cnt++; if(node->left!=nullptr) q.push(node->left); if(node->right!=nullptr) q.push(node->right); } return cnt; } };

思路3#

上面的两种方法都是使用遍历来做,没有使用到完全二叉树的性质。

完全二叉树是一棵空树或者它的叶子节点只出在最后两层,若最后一层不满则叶子节点只在最左侧。如果每一层的节点都是满的,则称为满二叉树。对于一个高度为 d 的满二叉树来讲,树中节点的个数为 2d1

对于完全二叉树中的一个节点:

  • 如果该节点左子树的高度等于该节点右子树的高度,都是 h,则说明该节点的左子树是满的,通过公式 2h1 计算左子树的节点个数,再加上根节点共 2h 个节点,然后递归计算右子树的节点个数;
  • 如果左子树的高度不等于右子树的高度,则说明最后一层不满,但倒数第 2 层满了,可以通过公式计算右子树的节点个数并递归计算左子树的节点个数。

代码如下:

Copy
/** * 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==nullptr) return 0; int left = getHeight(root->left); int right = getHeight(root->right); if(left==right){ return pow(2, left) + countNodes(root->right); }else{ return pow(2, right) + countNodes(root->left); } } int getHeight(TreeNode* root){ if(root==nullptr) return 0; return max(getHeight(root->left)+1, getHeight(root->right)+1); } };

参考#

https://leetcode-cn.com/problems/count-complete-tree-nodes/solution/chang-gui-jie-fa-he-ji-bai-100de-javajie-fa-by-xia/

posted @   Flix  阅读(351)  评论(0编辑  收藏  举报
编辑推荐:
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
阅读排行:
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· DeepSeek+PageAssist实现本地大模型联网
· 手把手教你更优雅的享受 DeepSeek
· 腾讯元宝接入 DeepSeek R1 模型,支持深度思考 + 联网搜索,好用不卡机!
· 从 14 秒到 1 秒:MySQL DDL 性能优化实战
点击右上角即可分享
微信分享提示
CONTENTS