题目:给定一个二叉树,判断它是否是高度平衡的二叉树。
二叉树的高度是指的当前节点到叶子节点的最长路径,所以当需要计算二叉树高度时,应该使用后序遍历。因为后序遍历顺序为 左 右 中,是先计算左右子节点的高度,再判断左右子树是否平衡一级计算中间节点的高度的。
后序遍历递归法:
时间复杂度:O(n),空间复杂度:O(n)
思路:
- 如果当前节点 cur 为空,表示这是一颗空树,返回高度 0。
- 递归计算左子树高度,检查左子树平衡性。如果是不平衡的二叉树,返回 -1,并在后续的检查中会一直返回 -1。
- 递归计算右子树高度,检查右子树平衡性。如果是不平衡的二叉树,返回 -1,并在后续的检查中会一直返回 -1。
- 检查当前节点树平衡性,递归回溯当前节点高度。
- 根据返回结果是否为 -1 判断该树是否为平衡二叉树。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
// 返回以该节点为根节点的二叉树的高度,如果不是平衡二叉树了则返回-1
int getHeight(TreeNode* cur) {
if (cur == nullptr)
return 0;
int leftHeight = getHeight(cur->left);
if (leftHeight == -1)
return -1;
int rightHeight = getHeight(cur->right);
if (rightHeight == -1)
return -1;
if (abs(leftHeight - rightHeight) > 1)
return -1;
else
return max(leftHeight, rightHeight) + 1;
}
bool isBalanced(TreeNode* root) {
// int ret = getHeight(root);
// if (ret == -1)
// return false;
// else
// return true;
return getHeight(root) == -1 ? false : true;
}
};