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

embedded/2025/3/14 7:10:29/

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就说明不是平衡二叉树,否则就是平衡二叉树。


http://www.ppmy.cn/embedded/172437.html

相关文章

无人机快速发展,无人机反制如何应对?

无人机&#xff0c;即无人驾驶飞机&#xff0c;是一种不搭载驾驶员、依靠遥控或预设程序自主飞行的航空器。随着技术的不断进步和应用领域的不断拓展&#xff0c;无人机已经在军事、民用、商业等多个领域展现出巨大的潜力和价值。 无人机反制是指采取一系列措施来防范、干扰、…

Linux入门 2025 全面整理终端 Bash、Vim 命令速记

Linux入门 2025 超详细全面整理 Bash、Vim 基础命令速记 刚面对高级感满满的 终端窗口是不是有点懵&#xff1f;于是乎&#xff0c;这份手册就是为你准备的高效学习指南&#xff01;我把那些让人头大的系统设置、记不住的命令都整理成了对你更友好的格式&#xff0c;让你快速学…

基于STM32F407ZGT6的硬件平台,(可选CubeMX) + PlatformIO软件开发的FreeRTOS部署指南

目录 前言 使用CubeMX生成代码的FreeRTOS移植方案 时钟选择 在Middlewares中选择FreeRTOS的版本支持 其他外设的支持 封装自己配置的任务 生成PIO代码 修改platformio.ini 第一步&#xff1a;指定我们的源码文件夹 第二步&#xff0c;解决FPU的选择问题 非CubeMX的Fr…

46. HarmonyOS NEXT 登录模块开发教程(一):模态窗口登录概述

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; HarmonyOS NEXT 登录模块开发教程&#xff08;一&#xff09;&#xff1a;模态窗口登录概述 文章目录 HarmonyOS NEXT 登录模块开发教程&#xff0…

ADB报错:daemon not running...

ADB报错&#xff1a;daemon not running… 解决步骤: ADB【问题】程序报错&#xff1a;daemon not running; starting now at tcp:5037 【原因】5037端口被占用 【方法】找出5037端口占用的应用&#xff0c;关闭掉该应用进程 【解决方案】打开cmd命令窗口&#xff0c;首先找出占…

stm32中分析UART中IDLE,RXNE,TC,TXE这些标志位的作用

下面将基于 STM32 标准库&#xff0c;结合之前提到的不同应用场景&#xff0c;给出使用 TXE、TC、IDLE 和 RXNE 标志位的代码示例及分析。 1. 连续数据发送&#xff08;使用 TXE&#xff09; 应用场景 向外部设备连续发送大量数据&#xff0c;如向显示屏发送显示数据、向传感…

前端发布缓存导致白屏解决方案

解决发布H5后因为本地缓存白屏方案 一、 核心配置优化&#xff08;前提是访问网站的请求能抵达服务器&#xff09; 方案一&#xff1a;前端项目设置全局不缓存方案 运行逻辑&#xff1a;在H5服务器配置中增加Cache-Control: no-cache或max-age0响应头&#xff0c;禁用静态资…

高频面试题(含笔试高频算法整理)基本总结回顾32

干货分享&#xff0c;感谢您的阅读&#xff01; &#xff08;暂存篇---后续会删除&#xff0c;完整版高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09;&#xff09; 备注&#xff1a;引用请标注出处&#xff0c;同时存在的问题请在相关博客留言&#xff0c…