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 };
作者:lc
出处:https://www.cnblogs.com/nxnslc-blog/p/12549501.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
转载请注明本人博客及地址,谢谢合作
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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搭建本