/**
* 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;
}
};
IsBalanced_Solution 函数:这是对外提供的接口函数,负责调用辅助的 dfs 函数来完成平衡二叉树的判断。它调用 dfs(pRoot) ,然后根据 dfs 的返回值是否为 -1 来决定最终返回 true(不是 -1 ,说明是平衡二叉树 )还是 false(是 -1 ,说明不是平衡二叉树 )。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 。