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

完全二叉树节点的数量 平衡二叉树

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

#include <bits/stdc++.h>
using namespace std;
struct TreeNode{
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x)
    {
        val=x;
        left=NULL;
        right=NULL;
    }
};
int getnode(TreeNode* root)
{
    if(root==NULL)
    return 0;
    int leftdepth=0;
    int rightdepth=0;
    TreeNode* left=root->left;
    TreeNode* right=root->right;
    while(left)
    {
        left=left->left;
        leftdepth++;
    }
    while(right)
    {
        right=right->right;
        rightdepth++;
    }
    if(leftdepth==rightdepth)
    {
        return (2<<leftdepth)-1;
    }
    int leftnum=getnode(root->left);
    int rightnum=getnode(root->right);
    return (leftnum+rightnum)+1;
    
}
int main()
{
    TreeNode* root=new TreeNode(21);
    root->left=new TreeNode(87);
    root->right=new TreeNode(7);
    root->left->left=new TreeNode(2);
    root->left->right=new TreeNode(1);
    root->left->left->left=new TreeNode(5);
    root->left->left->right=new TreeNode(4);
    root->left->right->left=new TreeNode(9);
    root->left->right->right=new TreeNode(8);
    root->right->left=new TreeNode(7);
    root->right->right=new TreeNode(6);
    cout<<getnode(root);
    return 0;
 } 

思路:对于求完全二叉树节点,可以使用求满二叉树的公式2的n次方减1,这里n指的是满二叉树的深度,为什么要用满二叉树的公式,其实我们可以来想,完全二叉树如果不是满二叉树,那么它左右子树深度一定不同,那么此时我们就分别求它左右子树的节点,因为此时它的左右子树必定是满二叉树,最后再加上根节点,就得到了完全二叉树的节点数。

这里我们用后序遍历的方法,里面用指针来进行遍历,根存在的情况下,先遍历左子树,然后左子树的左子树,一直到左子树为空,能够得到左子树的深度,而之后相应地遍历右子树,然后是右子树地右子树,一直到最后,得到右子树的深度。之所以只遍历两端的节点,其实是因为其余节点不值得遍历,只要其左端的左节点和右端的右节点存在,根据其是完全二叉树的特性,就不用遍历其余节点,因为肯定存在。

最后得到左右子树的深度,进行比较,如果相等就利用公式计算总结点,否则就分别计算左子树的总结点和右子树的总结点,,求它们的和再加上根节点。

2.给定一个二叉树,判断它是否是高度平衡的二叉树。

#include <bits/stdc++.h>
using namespace std;
struct TreeNode{
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x)
    {
        val=x;
        left=NULL;
        right=NULL;
    }
};
int get_height(TreeNode* root)
{
    if(root==NULL)
    return 0;
    int leftheight=get_height(root->left);
    if(leftheight==-1)
    {
        return -1;
    }
    int rightheight=get_height(root->right);
    if(rightheight==-1)
    {
        return -1;
     } 
    return abs(leftheight-rightheight)>1?-1:1+max(leftheight,rightheight);
    
 } 
bool balance(TreeNode* root)
{
    if(get_height(root)==-1)
    return false;
    
    return true;
}
int main()
{
    TreeNode* root=new TreeNode(1);
    root->left=new TreeNode(2);
    root->right=new TreeNode(3);
    root->left->left=new TreeNode(4);
    root->left->right=new TreeNode(5);
    get_height(root);
    cout<<balance(root);
    
    return 0;
}
 

思路:首先我们要知道什么是平衡二叉树,即左右子树高度差不大于1,所以我们需要遍历整棵树比较每个节点的左右子树高度差,只要有一个高度差大于1,那么整棵树就不是平衡二叉树。

在这里我们可以记一下,求高度用后序遍历,求深度用前序遍历。这里我们要求高度,因此用后序遍历来解决问题。

根存在情况下,先递归遍历根节点的左子树求左子树高度,其次是根节点右子树高度,然后比较两者的高度,高度差大于1就返回-1,否则就返回根节点的高度。最后判断如果得到-1就说明不是平衡二叉树,否则就是平衡二叉树。

相关文章:

  • 【视频】SRS将RTMP转WebRTC、HLS流;获取RTSP转其它流
  • JavaScript 运算符详解
  • 关于stac和clac的进一步细节及EFLAGS
  • 蓝桥备赛(18)- 红黑树和 set 与 map(上)
  • 每日一题力扣2697.字典序最小回文串c++
  • (每日一题) 力扣 179 最大数
  • unittest vs pytest区别
  • Proser:新增指令批次发送功能
  • 全外显子检测家系三样本联合分析+新发变异检测分析
  • 在 CentOS 7 上安装 PHP 7.3
  • SpaceClaim二次开发(3)
  • Android IdleHandler 原理解析与应用场景
  • Android 14 昼夜色切换多屏时候非主屏的Activity无法收到onConfigurationChanged
  • C语言之数据结构:理解什么是数据结构和算法(启航)
  • c++类和对象(下篇)上
  • 项目组织管理类型-矩阵式组织和组合式组织的区别
  • 数据结构——顺序表seqlist
  • 学习率调整策略
  • QT系列教程(19) Qt MVC结构之QItemDelegate介绍
  • FSC森林认证:推动全球森林的可持续管理
  • 企业备案做电影网站的后果/怎么寻找网站关键词并优化
  • 怎样下载做网站的软件/小说关键词自动生成器
  • 网站建设电商板块/seo怎样才能优化网站
  • 网站域名快速备案/搜索引擎入口官网
  • 合肥公司建设网站/竞价推广课程
  • 网站开发 教程/站长工具seo综合查询5g