222-完全二叉树的结点个数

完全二叉树和满二叉树的区别:如果二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布,则此二叉树被称为完全二叉树

由于题中已经告诉我们这是一颗完全二叉树,我们又已知了完全二叉树除了最后一层,其他层都是满的,并且最后一层的节点全部靠向了左边。那我们可以想到,可以将该完全二叉树可以分割成若干满二叉树和完全二叉树满二叉树直接根据层高h计算出节点为2^h-1,然后继续计算子树中完全二叉树节点。那如何分割成若干满二叉树和完全二叉树呢?对任意一个子树,遍历其左子树层高left,右子树层高right,相等左子树则是满二叉树,否则右子树是满二叉树
 
具体解析来自公众号小浩算法:https://mp.weixin.qq.com/s?__biz=MzI2NjI5MzU2Nw==&mid=2247484077&idx=1&sn=907c7cb13bc9b7994f0bf43921b6b1f6&chksm=ea911afddde693ebf618f6be32b884a5385eb1853d26f92033cba2fa5ea8a1da7d599dbf2e54&scene=21#wechat_redirect
 
复制代码
 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     int countNodes(TreeNode* root) {
13         if(root==NULL)
14         {
15             return 0;
16         }
17         int left=countlevel(root->left);
18         int right=countlevel(root->right);
19         if(left==right)
20         {
21             return countNodes(root->right)+(1<<left);
22         }
23         else
24         {
25             return countNodes(root->left)+(1<<right);
26         }
27 
28 
29     }
30     int countlevel(TreeNode* root)
31     {
32         int level=0;
33         while(root!=NULL)
34         {
35             level++;
36             root=root->left;
37         }
38         return level;
39     }
40 };
View Code
复制代码

 

posted @   是凉城吖  阅读(424)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示
主题色彩