二叉平衡树检查
题目描述:
实现一个函数,检查二叉树是否平衡,平衡的定义如下,对于树中的任意一个结点,其两颗子树的高度差不超过1。
给定指向树根结点的指针TreeNode* root,请返回一个bool,代表这棵树是否平衡。
题目分析:
- 先判断是否为空树,若为空,则平衡。
- 若不是空树,则该树必须满足以下条件:
(1) 自身的左右子树深度差值<=1
(2) 自身的左右子树都为平衡树. - 很显然,平衡二叉树是通过左右子树的高度来判断是否为平衡二叉树的,所以我们首先想到的是如何求一个树的高度,求一个树的高度很简单,递归求解,每次求出左右子树的最大高度再加1便是父节点的高度,这样递归下去,便可以求出任何一颗树的高度,然后进行比较。
代码示例:
public class Balance {
public boolean isBalance(TreeNode root){
if(root==null)
return true;
else {
if (Math.abs(deepth(root.left)-deepth(root.right))>1) {
return false;
}else {
return isBalance(root.left)&&isBalance(root.right);
}
}
}
public int deepth(TreeNode root) {
if (root==null) {
return 0;
}else {
return Math.max(deepth(root.left), deepth(root.right))+1;
}
}
}
上述代码,使用的是直接遍历子树深度的方式,但当要判断的树过于庞大时,就会出现效率上的问题。因为在遍历的过程中,子节点或多次求深度。想要解决这个问题,我们可以采用从下向上遍历的方式,每次保存当前深度,这样在计算上层节点深度时,就是当前深度加1,所以每个节点只求一次,当树过于复杂是就可以提高效率。
代码如下:
class Balance {
public:
bool isBalance(TreeNode *root, int *deepth) {
if (root == NULL) {
*deepth = 0;
return true;
}
int ldeepth, rdeepth;
if (isBalance(root->left, &ldeepth) && isBalance(root->right, &rdeepth)) {
int d= ldeepth - rdeepth;
if (d<= 1 && d>= -1) {
*deepth = (ldeepth > rdeepth ? ldeepth : rdeepth) + 1;
return true;
}
}
return false;
}
bool isBalance(TreeNode* root) {
int deepth = 0;
return isBalance(root, &deepth);
}
};