问题描述
Given a binary tree, determine if it is height-balanced.
For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.
问题分析
如果二叉树为平衡树,则他的任何一个节点的两个子树的高度差不能超过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:
bool isBalanced(TreeNode* root) {
return height(root) != -1;
}
int height(TreeNode* root)
{
if(root == NULL)
return 0;
int h_left = height(root->left);//递归节点的左子树
int h_right = height(root->right);//递归节点的右子树
if(h_left == -1 || h_right == -1 || abs(h_left - h_right) > 1)//如果左子树不平衡,或右子树不平衡,或两个子树高度相差大于一,则返回树高度为-1,代表不平衡子树
return -1;
return max(h_right, h_left) + 1;//如果是平衡树,返回以该节点为顶点的子树的高度;
}
};
总结
对于树的操作要思路清晰,我一开始的思路是写一个递归函数算高度,然后分别算出顶点的两个子树的高度,发现这并不能判断两个子树本身是不是平衡树,而且还很麻烦,所以这道题的关键不是算出一个高度的结果,而是判断子树本身是不是平衡树,以及两个子树的比较。