题目:
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,则是二叉平衡树。但是该解法会导致很多节点被重复遍历,时间复杂度较大。为此,剑指offer上给出了另一种解法,采用后序遍历的方式,在遍历每一个节点的时候,我们已经遍历了他的左右子树,只要在遍历的时候记录他们的深度,就可以一边遍历,一边判断每个节点是否是平衡的。
代码:
/**
* Definition for a binary tree node.
**/
typedef struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
}*BinaryTree;
class Solution {
public:
void CreateTree(BinaryTree &T)
{
char data;
cin >> data;
if (data == '#')
T = NULL;
else
{
T = new TreeNode(data - '0');
CreateTree(T->left);
CreateTree(T->right);
}
}
int maxDepth(TreeNode* root) {
if (root == NULL)
{
return 0;
}
int depthL = maxDepth(root->left);
int depthR = maxDepth(root->right);
return depthL > depthR ? depthL + 1 : depthR + 1;
}
bool isBalanced(TreeNode* root) {//通过二叉树的深度来判断,如果每个节点的左右子树的深度差都不超过1,则为一颗平衡二叉树
if (root == NULL)
return true;
int depthL = maxDepth(root->left);
int depthR = maxDepth(root->right);
int diff = abs(depthL - depthR);
if (diff > 1)
return false;
return isBalanced(root->left) && isBalanced(root->right);
}
bool isbalance(TreeNode * root, int &depth)
{
}
/*depth初始时为0*/
bool isBalanced2(TreeNode* root,int *depth) {//剑指offer上给出的解法,后序遍历节点,遍历每个节点时,记录他的深度,一边遍历一边判断每个节点是不是平衡的。
if (root == NULL)
{
*depth = 0;
return true;
}
int left, right;
if (isBalanced2(root->left, &left) && isBalanced2(root->right, &right))
{
int diff = abs(left - right);
if (diff < 1)
{
*depth = max(left, right) + 1;
return true;
}
}
return false;
}
};