剑指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

相关推荐

头像
昨天 14:28
长沙理工大学
刷算法真的是提升代码能力最快的方法吗?&nbsp;刷算法真的是提升代码能力最快的方法吗?
牛牛不会牛泪:看你想提升什么,代码能力太宽泛了,是想提升算法能力还是工程能力? 工程能力做项目找实习,算法也分数据结构算法题和深度学习之类算法
点赞 评论 收藏
分享
三年之期已到我的offer快到碗里来:9硕都比不上9本
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务