剑指offer39平衡二叉树判断

平衡二叉树

https://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId=13&&tqId=11192&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

剑指offer39平衡二叉树判断

剑指offer39

图片说明

1、常规思路
封装一个求节点深度的方法,然后遍历树,调用该方法并判断是否符合平衡二叉树
时间复杂度O(n^2) 空间复杂度O(n^2),主要是递归的原因
个人解题参考

class Solution {
public:
    int TreeDepth(TreeNode* pRoot) //节点深度
    {
        if(!pRoot) return 0;
        return max(TreeDepth(pRoot->left),TreeDepth(pRoot->right))+1;
    }
    bool IsBalanced_Solution(TreeNode* pRoot) {
        stack<TreeNode*>st; //通过栈迭代中序遍历
        while(pRoot||st.size()!=0)
        {
            while(pRoot)
            {
                st.push(pRoot);
                pRoot=pRoot->left;
            }
            pRoot=st.top();
            st.pop();
            while(abs(TreeDepth(pRoot->left)-TreeDepth(pRoot->right))>1)
            {
                return false;
            }
            pRoot=pRoot->right;
        }
        return true;
    }
};

2、对上述时间空间优化
两层循环遍历实际不必要,内层求节点深度的遍历的同时就可以直接判断每个节点为根节点的子树是否平衡,平衡则继续递归判断计算其他节点深度并判断,不平衡则停止后续递归。我们需要的仅是一个是否平衡二叉树的标记
时间复杂度:O(n) 空间复杂度:O(1)
个人解题参考

class Solution {
public:
    bool flag=true; //是否为平衡二叉树
    int TreeDepth(TreeNode* pRoot) //节点深度
    {
        if(!flag) return -1;  //若已经判断不是平衡二叉树,接下来的递归无需继续进行
        if(!pRoot) return 0;
        int leftChild_depth=TreeDepth(pRoot->left)+1;
        int rightChild_depth=TreeDepth(pRoot->right)+1;
        if(abs(leftChild_depth-rightChild_depth)>1)  //不是平衡二叉树
            flag=false;
        return max(leftChild_depth,rightChild_depth);
    }
    bool IsBalanced_Solution(TreeNode* pRoot) {
       TreeDepth(pRoot);
       return flag;
    }
};
全部评论
方法2纠正:递归存在,(最坏)空间复杂度O(n)
点赞 回复 分享
发布于 2021-05-31 19:22

相关推荐

10-23 16:33
门头沟学院 Java
本人某中9本科,成绩中等,目前没科研没实习,目前后端学到了javaWeb,开始没定好方向,在学国外课程,走工程路线起步有点晚了,到这个时间点了还在学JavaWeb,顿感迷茫,不知道是坚持走下去还是寒假去准备考研。考研这个路弄得我还是心痒痒的,因为从众考研的人也不在少数,所以会有这方面的心理安慰吧,就是“不行我可以去考研啊”,而且意味着三年的缓冲,为了复试还有积攒经验美化简历,其实现在也可以去申入实验室打杂;就业可能意味着多些工作经验,工程岗应该到后面还是经验大于学历?还是有点迷茫了,求助好心人有无路线启发
千千倩倩:同27给点建议,现在这个时间点可以快速看完外卖和点评,不用跟着敲,但一定要在看的时候总结每个部分的整个业务流程,对其中的实现有一个大概的印象。然后直接开始看八股,刷算法。八股和算法最好还是在项目学习中穿插着看。如果计算机基础,算法这些基础好,加上每天刻苦学习,两周可以达到勉强能面试的水平,到时候就直接海投中小厂,在约面和面试的过程中不断巩固知识。没找到实习也没关系,就当积累经验。再沉淀一波直接明年三月开始投暑期,毕竟是9本,总是有面试机会的,只要你这三个月不懈怠,面试发挥得一定不错,只要拿到一个中,大厂暑期实习,秋招就有竞争力了。总得而言,现在还有机会,但是时间非常紧张,需要你结合自己情况考虑,共勉
你会选择考研还是直接就业
点赞 评论 收藏
分享
LuvSran:是人我吃。老师就是学校呆久了,就业方面啥都不懂,还自以为是为了我们就业好。我学校就一破双非,计科入行率10%都没有,某老师还天天点名,说是出勤率抬头率前排率高了,华为什么的大厂就会来,我们就是不好好上课才没有厂来招。太搞笑了
点赞 评论 收藏
分享
09-29 16:59
已编辑
门头沟学院 Java
牛客96609213...:疯狂背刺,之前还明确设置截止日期,还有笔试,现在一帮人卡在复筛,他反而一边开启扩招,还给扩招的免笔试,真服了,你好歹先把复筛中的给处理了再说
投递大疆等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务