/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution 
{
public:
    // 对外的接口函数,用于判断二叉树是否是平衡二叉树
    bool IsBalanced_Solution(TreeNode* pRoot) 
    {
        // 调用辅助的 dfs 函数,若返回值不是 -1,说明是平衡二叉树,返回 true;否则返回 false
        return dfs(pRoot) != -1;  
    }

    // 辅助的深度优先搜索(DFS)函数,兼具计算子树深度和判断是否平衡的功能
    // 返回值:如果以 root 为根节点的子树是平衡的,返回该子树的深度;如果不平衡,返回 -1
    int dfs(TreeNode* root)
    {
        // 如果当前节点是空节点,那么它的深度是 0 ,直接返回 0
        if(root == nullptr) return 0;  

        // 递归计算左子树的深度,同时检查左子树是否平衡
        int left = dfs(root->left);  
        // 如果左子树返回 -1 ,说明左子树不平衡,那么当前整棵树也不平衡,直接返回 -1
        if(left == -1) return -1;  

        // 递归计算右子树的深度,同时检查右子树是否平衡
        int right = dfs(root->right); 
        // 如果右子树返回 -1 ,说明右子树不平衡,那么当前整棵树也不平衡,直接返回 -1
        if(right == -1) return -1;  

        // 判断当前节点的左子树和右子树的深度差的绝对值是否大于 1 
        // 如果大于 1 ,说明当前节点为根的子树不平衡,返回 -1
        if(abs(left - right) > 1) return -1;  

        // 如果当前子树平衡,返回当前子树的深度,深度为左右子树中较大的深度值加 1(加上当前节点这一层)
        return max(left, right) + 1;  
    }
};
  1. IsBalanced_Solution 函数:这是对外提供的接口函数,负责调用辅助的 dfs 函数来完成平衡二叉树的判断。它调用 dfs(pRoot) ,然后根据 dfs 的返回值是否为 -1 来决定最终返回 true(不是 -1 ,说明是平衡二叉树 )还是 false(是 -1 ,说明不是平衡二叉树 )。
  2. dfs 函数:递归终止条件:当遇到空节点(root == nullptr )时,认为它的深度是 0 ,返回 0 。这是递归往子节点深入到最底层后的返回情况,构建了递归的基础。递归计算左右子树深度并检查平衡性:先通过 int left = dfs(root->left); 递归计算左子树的深度,并且在这个过程中,会顺带检查左子树是否平衡。如果左子树不平衡(left == -1 ),那么以当前节点为根的整棵子树肯定也不平衡,直接返回 -1 ,向上层递归传递不平衡的信息。同理,通过 int right = dfs(root->right); 递归计算右子树的深度并检查右子树的平衡性,若右子树不平衡(right == -1 ),返回 -1 。检查当前节点为根的子树是否平衡:通过 abs(left - right) > 1 判断当前节点的左、右子树深度差的绝对值是否超过 1 。如果超过,说明以当前节点为根的子树不平衡,返回 -1 。返回当前子树深度:如果前面的检查都通过,说明以当前节点为根的子树是平衡的。此时当前子树的深度是左右子树中深度较大的值再加 1(加上当前节点所在的这一层 ),所以返回 max(left, right) + 1 。