题. 平衡二叉树
输入一棵二叉树的根结点,判断该树是不是平衡二叉树。
如果某二叉树中任意结点的左右子树的深度相差不超过 1,那么它就是一棵平衡二叉树。
注意:
规定空树也是一棵平衡二叉树。
数据范围
树中节点数量 [0,500]。
样例
输入:二叉树[5,7,11,null,null,12,9,null,null,null,null]如下所示,
5
/ \
7 11
/ \
12 9
输出:true
【题解】--- 枚举
首先我们要知道判断 平衡二叉树
的依据:
- 空树平衡二叉树
- |平衡因子|<=1
平衡因子=一个节点的左子树高度-右子树高度
这道题的做法也就是将求深度的代码稍作修改,不重复求深度。
也可以直接用高度h,平衡二叉树递归满足:
- 左右子树是平衡的
- 左子树-右子树高度的绝对值<2
复杂度分析:
时间复杂度因为只遍历结点一次,所以最坏情形为O(n)
C++代码实现:
class Solution {
public:
bool isBalanced(TreeNode* root) {
/*
unit test
root is nil
root not nil, left is nil, right is nil
root not nil, left not nil, right nil.
*/
int height=dfs(root);
if(height>=0) return true;
else return false;
}
// 当非平衡时,return -1; 平衡时,return high;
// 首先判断左子树平衡与否,再判断右子树平衡与否,在判断整棵树平衡与否;
int dfs(TreeNode *root){
if(!root) return 0;
int left=dfs(root->left);
if(left<0) return -1;
int right=dfs(root->right);
if(right<0) return -1;
if(abs(left-right)>1) return -1;
return max(left,right)+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) {
if(!root) return true;
return isBalanced(root->left)&&isBalanced(root->right)&&abs(h(root->left)-h(root->right))<2;
}
int h(TreeNode *bt)
{
if(!bt)return 0;
return max(h(bt->left),h(bt->right))+1;
}
};