问题描述:
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
(2)左右子树都是平衡二叉树
方法一:简单直观,但存在重复访问节点的情况
/**
* 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) {
//判断是否是平衡二叉树:
//(1)左右子树高度相差不超过1
//(2)左右子树都是平衡二叉树
if(!root) return true;
int leftHight = getHight(root->left);
int rightHight = getHight(root->right);
if(abs(leftHight - rightHight) > 1) return false;//(1)
return isBalanced(root->left) && isBalanced(root->right);//(2)
}
int getHight(TreeNode* root)
{//获得二叉树高度
if(!root) return 0;
int lHight = getHight(root->left);
int rHight= getHight(root->right);
return max(lHight, rHight)+1;
}
};
方法二:效率较高,以后序遍历方式实现。
/**
* 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) {
//只实例化了一次Solution对象
int depth = 0;
return isbalance(root, depth);
}
bool isbalance(TreeNode *root, int &depth)
{
if(root == NULL)
{
depth = 0;
return true;
}
int ldepth,rdepth;
if( isbalance(root->left,ldepth) && isbalance(root->right,rdepth))
{
if( abs(ldepth - rdepth) > 1) return false;
depth = max(ldepth, rdepth)+1;
return true;
}
}
};