当前位置: 首页 > wzjs >正文

首页百度杭州seo推广服务

首页百度,杭州seo推广服务,网站建设需要配置环境么,用凡科做网站要钱吗leetcode:222. 完全二叉树的节点个数 - 力扣(LeetCode) 题目 给出一个完全二叉树,求出该树的节点个数。 示例 1: 输入:root [1,2,3,4,5,6]输出:6 示例 2: 输入:root []输出&…

leetcode:222. 完全二叉树的节点个数 - 力扣(LeetCode)

题目

给出一个完全二叉树,求出该树的节点个数。

示例 1:

  • 输入:root = [1,2,3,4,5,6]
  • 输出:6

示例 2:

  • 输入:root = []
  • 输出:0

示例 3:

  • 输入:root = [1]
  • 输出:1

提示:

  • 树中节点的数目范围是[0, 5 * 10^4]
  • 0 <= Node.val <= 5 * 10^4
  • 题目数据保证输入的树是 完全二叉树

思路

我们分别来看普通二叉树的解法和完全二叉树的解法。

普通二叉树 

递归法很简单,对于一个节点,求其左子树节点数量+求其右子树节点数量+其本身所占1个节点=以这个节点为树根节点的树节点个数,从描述中看出后序遍历是比较好写的,代码如下:

// --------------------------普通二叉树节点个数,递归法--------------------------
class Solution
{/*** 计算以给定根节点为基础的二叉树的节点数量* * @param root 二叉树的根节点指针* @return 返回二叉树的节点数量*/private:int getNodeNum(TreeNode *root){// 如果根节点为空,说明树不存在,返回0if(root==NULL)return 0;// 递归计算左子树的节点数量int leftNum=getNodeNum(root->left);// 递归计算右子树的节点数量int rightNum=getNodeNum(root->right);// 当前树的节点数量为左子树节点数、右子树节点数加上根节点,共计左子树节点数+右子树节点数+1int treeNum=leftNum+rightNum+1;// 返回当前树的节点数量return treeNum;}/*** 计算二叉树的节点数量的公共接口* * @param root 二叉树的根节点指针* @return 返回二叉树的节点数量*/public:int countNodes(TreeNode *root){// 调用私有方法计算节点数量并返回结果return getNodeNum(root);}
};

也可以不用再定义getNodeNum函数,直接在public里面的函数操作,然后精简一下代码:

// --------------------------普通二叉树节点个数,递归法(精简版本)--------------------------
class Solution
{
public:int countNodes(TreeNode *root){if (root == NULL)return 0;return 1 + countNodes(root->left) + countNodes(root->right);}
};

以上是递归法,我们前面在用迭代法的层序遍历时,使用队列记录了每一层的元素,这里只需要稍微修改模板就可以求节点数量了,代码如下:

// --------------------------普通二叉树节点个数,迭代法层序遍历--------------------------
class Solution {public:int countNodes(TreeNode* root) {queue<TreeNode*> que;int result=0;if(root!=NULL)  que.push(root);while(!que.empty()){int size=que.size();while(size){TreeNode *node=que.front();que.pop();result++;if(node->left)  que.push(node->left);if(node->right) que.push(node->right);size--;}}return result;}};

完全二叉树

以上方法对于普通二叉树都可以解决,对于完全二叉树,他自己也有特性。

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

 

 

完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。

对于情况一,可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。

对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。

完全二叉树(一)如图:

 完全二叉树(二)如图:

可以看出如果整个树不是满二叉树,就递归其左右孩子,直到遇到满二叉树为止,用公式计算这个子树(满二叉树)的节点数量。

如何去判断一个左子树或者右子树是不是满二叉树呢?

在完全二叉树中,如果递归向左遍历的深度等于递归向右遍历的深度,那说明就是满二叉树。如图:

在完全二叉树中,如果递归向左遍历的深度不等于递归向右遍历的深度,则说明不是满二叉树,如图:

判断其子树是不是满二叉树,如果是则利用公式计算这个子树(满二叉树)的节点数量,如果不是则继续递归。

利用完全二叉树特性计算节点数量的代码如下:

// --------------------------完全二叉树求节点个数--------------------------
class Solution
{
public:/*** 计算二叉树的节点数* @param root 二叉树的根节点指针* @return 返回二叉树的节点总数*/int countNodes(TreeNode *root){// 如果根节点为空,说明树不存在,返回0if (root == NULL)return 0;// 分别获取根节点的左子树和右子树TreeNode *left = root->left;TreeNode *right = root->right;// 初始化左子树和右子树的深度int leftDepth = 0, rightDepth = 0;// 计算左子树的深度while (left){left = left->left;leftDepth++;}// 计算右子树的深度while (right){right = right->right;rightDepth++;}// 如果左右子树深度相同,说明最后一层节点数相同,可以使用满二叉树的性质计算总节点数if (leftDepth == rightDepth){return (2 << leftDepth) - 1;}// 如果左右子树深度不同,说明最后一层节点数不同,需要分别计算左子树和右子树的节点数,再加上根节点return countNodes(root->left) + countNodes(root->right) + 1;}
};

总结

满二叉树一定是完全二叉树,所以完全二叉树里面的满二叉树部分可以利用公式来计算节点数量。

参考资料

代码随想录 

要理解普通二叉树和完全二叉树的区别! | LeetCode:222.完全二叉树节点的数量_哔哩哔哩_bilibili 

http://www.dtcms.com/wzjs/506688.html

相关文章:

  • 用帝国做的网站绍兴seo外包
  • 网站登录验证码显示不出来云巅seo
  • 医院做网站定位电商代运营十大公司排名
  • 伍佰亿网站建设深圳优化公司统高粱seo
  • 青州市网站建设电商平台怎么运营的
  • 帮人负责做网站叫什么工作品牌网络营销推广方案策划
  • 内衣网站建设详细方案小红书推广方案
  • 网页游戏网站链接怎么推广软件让别人下载
  • visual studio 开发网站开发外贸推广渠道有哪些
  • 义乌网八方资源家1688网商网郑州seo排名公司
  • 怎么设置网站栏目竞价外包托管费用
  • 广州网站建设 美词域名流量查询工具
  • 商城网站开发设计sem优化推广
  • 什么是网站实施哈尔滨关键词优化方式
  • 河北区做网站公司全网营销的公司
  • 网站建设一般怎么付款官网优化包括什么内容
  • 电子商务网站开发课程设计百度seo营销公司
  • 网站定制需求seo外链技巧
  • 免费营销网站制作搜索引擎国外
  • 涿鹿镇做网站企业站seo
  • 大连网页设计师招聘福州关键词排名优化
  • 毕业设计做系统网站好做营销策划的公司
  • 漳州网站开发营销推广方案设计
  • 工程信息网站排名抖音优化是什么意思
  • 上海电商网站建设公司百度推广电话号码
  • 迈肯奇迹做网站百度云app下载安装
  • 浙江电信关于网站备案信息核实的公告网络推广seo是什么
  • 申请免费网站建设十大收益最好的自媒体平台
  • 怎样使用仿站小工具做网站淘宝怎么提高关键词搜索排名
  • 政务公开和网站建设工作问题新闻头条今日最新消息