热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

222完全二叉树的节点个数(递归、层次遍历)

1、给出一个完全二叉树,求出该树的节点个数。说明:完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外&#x

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

说明:

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

2、示例

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

输出: 6

3、题解

解法一:

基本思想:递归,利用完美二叉树的性质,满二叉树的节点总数是2^depth-1。分别求左右子树的最大深度。

  • 如果左右子树深度是一样的话,那么左子树一定是满二叉树,左子树节点数2^leftdepth-1加上根节点就是2^leftdepth
  • 如果左子树深度大于右子树深度,那么右子树一定是满二叉树,右子树节点数2^rightdepth-1加上根节点就是2^rightdepth

解法二:

基本思想:层次遍历,将每一层的节点数加到res

#include
#include
#include
#include
using namespace std;
struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
#define inf 9999
void Init_TreeNode(TreeNode** T, vector& vec, int& pos)
{if (vec[pos] == inf || vec.size() == 0)*T = NULL;else{(*T) = new TreeNode(0);(*T)->val = vec[pos];Init_TreeNode(&(*T)->left, vec, ++pos);Init_TreeNode(&(*T)->right, vec, ++pos);}
}
class Solution {
public:int countNodes(TreeNode* root) {//基本思想:层次遍历,将每一层的节点数加到resdeque queue;int res = 0;;if (root != nullptr)queue.push_front(root);while (!queue.empty()){int len = queue.size();res += len;while (len--){TreeNode* temp = queue.back();queue.pop_back();if (temp->left != nullptr)queue.push_front(temp->left);if (temp->right != nullptr)queue.push_front(temp->right);}}return res;}
};
class Solution1 {
public:int countNodes(TreeNode* root) {//基本思想:递归,利用完全二叉树的性质,满二叉树的节点总数是2^k-1//分别求左右子树的最大深度//如果左右子树深度是一样的话,那么左子树一定是满二叉树,左子树节点数2^leftdepth-1加上根节点就是2^leftdepth//如果左子树深度大于右子树深度,那么右子树一定是满二叉树,右子树节点数2^rightdepth-1加上根节点就是2^rightdepthif (root == nullptr)return 0;int leftdepth = depth(root->left);int rightdepth = depth(root->right);if (leftdepth == rightdepth)return pow(2, leftdepth) + countNodes(root->right);elsereturn pow(2, rightdepth) + countNodes(root->left);}int depth(TreeNode* root){int dep = 0;while (root){dep++;root = root->left;}return dep;}
};
int main()
{Solution1 solute;TreeNode* root &#61; NULL;vector vec &#61; { 1,2,4,inf,inf,5,inf,inf,3,6,inf,inf,inf };int pos &#61; 0;Init_TreeNode(&root, vec, pos);cout <}

 


推荐阅读
  • 由二叉树到贪心算法
    二叉树很重要树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。单就面试而言,在 ... [详细]
  • 丽江客栈选择问题
    本文介绍了一道经典的算法题,题目涉及在丽江河边的n家特色客栈中选择住宿方案。两位游客希望住在色调相同的两家客栈,并在晚上选择一家最低消费不超过p元的咖啡店小聚。我们将详细探讨如何计算满足条件的住宿方案总数。 ... [详细]
  • 本题探讨了在大数据结构背景下,如何通过整体二分和CDQ分治等高级算法优化处理复杂的时间序列问题。题目设定包括节点数量、查询次数和权重限制,并详细分析了解决方案中的关键步骤。 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • JSOI2010 蔬菜庆典:树结构中的无限大权值问题
    本文探讨了 JSOI2010 的蔬菜庆典问题,主要关注如何处理非根非叶子节点的无限大权值情况。通过分析根节点及其子树的特性,提出了有效的解决方案,并详细解释了算法的实现过程。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 版本控制工具——Git常用操作(下)
    本文由云+社区发表作者:工程师小熊摘要:上一集我们一起入门学习了git的基本概念和git常用的操作,包括提交和同步代码、使用分支、出现代码冲突的解决办法、紧急保存现场和恢复 ... [详细]
  • 在编译BSP包过程中,遇到了一个与 'gets' 函数相关的编译错误。该问题通常发生在较新的编译环境中,由于 'gets' 函数已被弃用并视为安全漏洞。本文将详细介绍如何通过修改源代码和配置文件来解决这一问题。 ... [详细]
  • 探讨ChatGPT在法律和版权方面的潜在风险及影响,分析其作为内容创造工具的合法性和合规性。 ... [详细]
  • 序列化与反序列化是数据处理中的重要技术,特别是在网络通信和数据存储中。它们允许将复杂的数据结构转换为可传输或存储的格式,再从这些格式恢复原始数据。本文探讨了序列化与反序列化的基本概念,以及它们在不同协议模型中的角色。 ... [详细]
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • 本文将详细介绍多个流行的 Android 视频处理开源框架,包括 ijkplayer、FFmpeg、Vitamio、ExoPlayer 等。每个框架都有其独特的优势和应用场景,帮助开发者更高效地进行视频处理和播放。 ... [详细]
  • 二叉树的链表实现
    本文介绍了一种使用链表结构表示二叉树的方法。通过定义节点结构和相关操作函数,可以方便地创建、插入和遍历二叉树。 ... [详细]
  • Python自动化测试入门:Selenium环境搭建
    本文详细介绍如何在Python环境中安装和配置Selenium,包括开发工具PyCharm的安装、Python环境的设置以及Selenium包的安装方法。此外,还提供了编写和运行第一个自动化测试脚本的步骤。 ... [详细]
author-avatar
书友31443126_163
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有