• 剑指 Offer 55 - II. 平衡二叉树


    原题链接:剑指 Offer 55 - II. 平衡二叉树

    输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。

    示例 1:

    给定二叉树 [3,9,20,null,null,15,7]

        3
       / \
      9  20
        /  \
       15   7
    
    • 1
    • 2
    • 3
    • 4
    • 5

    返回 true 。

    示例 2:

    给定二叉树 [1,2,2,3,3,null,null,4,4]

           1
          / \
         2   2
        / \
       3   3
      / \
     4   4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    返回 false 。

    限制:

    0 <= 树的结点个数 <= 10000


    方法一:自顶向下的递归

    思路:

    求树高:

    • p是空节点时,树高是0
    • p是非空结点时,树高就是左右子树树高的最大值 + 1

    有了计算节点高度的函数,即可判断二叉树是否平衡。
    具体做法类似于二叉树的前序遍历,即对于当前遍历到的节点,首先计算左右子树的高度,如果左右子树的高度差是否不超过 1,再分别递归地遍历左右子节点,并判断左子树和右子树是否平衡。
    这是一个自顶向下的递归的过程。

    C++代码:

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        // 求以root为根的子树的高
        int getHeight(TreeNode* root){
            if(!root)
                return 0;
            
            return max(getHeight(root->left), getHeight(root->right)) + 1;
        }
    
        bool isBalanced(TreeNode* root) {
            if(!root) 
                return true;
                
            // 如果根平衡 就递归去看左右子树是否平衡
            if(abs(getHeight(root->left) - getHeight(root->right)) <= 1)
                return isBalanced(root->left) && isBalanced(root->right);
                
            return false;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    复杂度分析:

    • 空间复杂度:O(n),其中 n 是二叉树中的节点个数。
      空间复杂度主要取决于递归调用的层数(就是递归调用栈的深度),递归调用的层数不会超过 n。
    • 时间复杂度:O(n2),其中 n 是二叉树中的节点个数。
      最坏情况下,二叉树是满二叉树,需要遍历二叉树中的所有节点,时间复杂度是 O(n)。
      对每个结点要求树高,最坏的情况高度为 O(n),此时总时间复杂度为 O(n^2)。

    方法二:自底向上的递归 + 剪枝

  • 相关阅读:
    Golang洗牌算法(Golang乱序算法)
    ChatGPT对软件测试的影响
    基于Java的医院管理系统设计与实现(源码+lw+部署文档+讲解等)
    lua 元表和面向对象
    使用 Woodpecker 与 Gitea 搭建纯开源的 CI 流程|极限降本
    高阶函数的简单写法
    Directory Monitor Pro v2.15.0.7 文件目录监控软件
    解决Qt5.13.0无MySQL驱动问题
    Python学习笔记(2)
    GDPU 数据结构 天码行空4
  • 原文地址:https://blog.csdn.net/cwtnice/article/details/128014079