题目
给定一个二叉树,判断它是否是 平衡二叉树
平衡二叉树 是指该树所有节点的左右子树的高度相差不超过 1。
解题思路
平衡二叉树要满足局部平衡和全局平衡,所谓局部平衡就是树的所有子树都要是平衡的。
- 左右子树的高度差不超过1
- 左子树是平衡二叉树
- 右子树是平衡二叉树
可以遍历节点,判断每个节点是不是平衡二叉树,若不是直接返回 false 。遍历完整个树都是平衡二叉树才返回 true
采用递归方法,自底向上判断。
- 后序遍历二叉树(左-右-根)
- 对于每个节点,先判断其左右子树是否平衡,再判断以该节点为根的子树是否平衡
- 如果在任何一点发现不平衡,立即返回一个特殊值(如-1)表示不平衡
- 如果子树平衡,则返回其高度
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
// 辅助函数:计算树高度,同时判断是否平衡
// 如果树不平衡,返回-1;否则返回树的高度
int height(struct TreeNode* root) {
// 空节点高度为0
if (root == NULL) return 0;
// 计算左子树高度,如果左子树不平衡,直接返回-1
int leftHeight = height(root->left);
if (leftHeight == -1) return -1;
// 计算右子树高度,如果右子树不平衡,直接返回-1
int rightHeight = height(root->right);
if (rightHeight == -1) return -1;
// 检查当前节点是否平衡
if (abs(leftHeight - rightHeight) > 1) return -1;
// 返回当前节点为根的子树高度
return (leftHeight > rightHeight ? leftHeight : rightHeight) + 1;
}
bool isBalanced(struct TreeNode* root) {
return height(root) != -1;
}
1125

被折叠的 条评论
为什么被折叠?



