首页 > 其他分享 >代码随想录——二叉树-12.平衡二叉树

代码随想录——二叉树-12.平衡二叉树

时间:2024-11-11 12:19:09浏览次数:1  
标签:12 return int 复杂度 随想录 height 二叉树 root


image

自顶向下递归(前序遍历)

这种方法是一开始想到的,虽然ac了但是对于它的本质却不清不楚,不知道时间复杂度,不知道属于前序遍历。

思路

首先得到root节点的左右子树的深度(左右),若深度差绝对值大于1(中),则root为根的树不是平衡二叉树;
否则继续递归root的左右子树,其左右子树都是平衡二叉树时,root才是平衡二叉树。

代码

class Solution {
public:
    int depth(TreeNode* root){
        if(root == nullptr)return 0;
        return max(depth(root->left),depth(root->right)) + 1;
    }

    bool isBalanced(TreeNode* root) {
        if(root == nullptr)return true;

        int cha = depth(root->left) - depth(root->right);
        if(cha > 1 || cha < -1)return false;

        return isBalanced(root->left) && isBalanced(root->right);
    }

};

复杂度

时间复杂度:O(n^2),n是节点个数

最坏情况,二叉树是满二叉树,需要遍历所有节点,时间复杂度O(n)
对于节点p,如果它的高度是d,则height(p)会被调用d次(即遍历到它的每一个祖先节点时)。而最坏情况下,二叉树是链式结构,高度为n,此时总时间复杂度为O(n^2)

自底向上递归(后序遍历)

思路

image

代码

class Solution {
public:
    int height(TreeNode* root){
        if(root == nullptr)return 0;
        int lheight = height(root->left);
        int rheight = height(root->right);   
        //左右子树不是平衡二叉树就返回-1
        if(lheight == -1 || rheight == -1)return -1;
        //以root为根的树不是平衡二叉树也返回-1
        if(abs(lheight - rheight) > 1) return -1;
        //以root为根的树是平衡二叉树,则返回以root为根的树的深度
        return max(lheight,rheight) + 1;

    }

    bool isBalanced(TreeNode* root) {
        return height(root) >= 0;
    }

};

复杂度

image

标签:12,return,int,复杂度,随想录,height,二叉树,root
From: https://www.cnblogs.com/neromegumi/p/18539434

相关文章

  • 代码随想录——二叉树-11.完全二叉树的节点个数
    思路一、层序遍历,时间复杂度O(n)二、利用完全二叉树性质,时间复杂度O(logn*logn)(小于O(n))完全二叉树性质:若树深度为h,则前h-1层节点都达到最大值。第h层节点都集中在最左侧的位置完全二叉树要么1.是满二叉树2.最后一层没满满二叉树计算节点数太方便了,直接用公式2^h-1。......
  • 题解:P11250 [GESP202409 八级] 手套配对
    题目传送门思路讲解一道非常经典的排列组合的题。首先,我们要先从nnn对手套中取走kk......
  • debian12.7的apt默认源
    查看源root@debian:~#cat/etc/apt/sources.list#debcdrom:[DebianGNU/Linux12.7.0_Bookworm_-Officialamd64NETINSTwithfirmware20240831-10:38]/bookwormcontribmainnon-free-firmwaredebhttp://deb.debian.org/debian/bookwormmainnon-free-firmware......
  • 代码随想录之滑动窗口、Java日期api、集合(11.4-11.11)
    代码1、长度最小的子数组⭐使用滑动窗口的思想,外层循环控制结束位置j,内层循环控制起始位置i,看似是双层循环,但时间复杂度是o(2n)。 2、水果成篮自己想法:使用backet1和backet2表示篮子1和篮子2;使用backet1Account和backet2Account分别表示两个篮子里水果的数量,内层循环将i指针......
  • 912. 排序数组
    题目链接本题使用的是快排解决。思路:「荷兰国旗」问题,具体思路跳转75.颜色分类代码classSolution{public:voidswap(vector<int>&nums,inti,intj){inttmp=nums[i];nums[i]=nums[j];nums[j]=tmp;}//[L,......
  • C#/.NET/.NET Core技术前沿周刊 | 第 12 期(2024年11.01-11.10)
    前言C#/.NET/.NETCore技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NETCore领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。欢迎投稿、推荐或自荐优质文章、项目、学习资源等......
  • 数据结构 ——— 链式二叉树oj题:对称二叉树
    目录题目要求手搓一个对称二叉树代码实现 题目要求给你一个二叉树的根节点 root ,检查它是否轴对称手搓一个对称二叉树代码演示://数据类型typedefintBTDataType;//二叉树节点的结构typedefstructBinaryTreeNode{ BTDataTypedata;//每个节点的数据......
  • 实验12:外观模式
    [实验任务一]:计算机开启在计算机主机(Mainframe)中,只需要按下主机的开机按钮(on()),即可调用其他硬件设备和软件的启动方法,如内存(Memory)的自检(check())、CPU的运行(run())、硬盘(HardDisk)的读取(read())、操作系统(OS)的载入(load()),如果某一过程发生错误则计算机启动失败。......
  • 实现链式结构二叉树
    目录需要实现的操作链式结构二叉树实现结点的创建前序遍历中序遍历后序遍历计算结点个数计算二叉树的叶子结点个数 计算二叉树第k层结点个数计算二叉树的深度查找值为x的结点 销毁层序遍历判断是否为完全二叉树 总结需要实现的操作//前序遍历voidPreOr......
  • F12开发者工具
    控制台network浏览器F12进入。F5刷新参考文档:http请求中各参数详解_参数在request的哪个部位-CSDN博客一、总详解调试时使用最多的功能页面是:元素(ELements)、控制台(Console)、源代码(Sources)、网络(Network)等。元素(Elements)用于查看或修改HTML元素的属性、CSS属性、监听事......