知识点
平衡二叉树的性质
1、空树是一棵平衡二叉树
2、一棵树不为空,并且其中所有的子树都满足各自的左子树与右子树的高度差都不超过1.
这棵以节点1为头的整棵树树不是平衡二叉树,因为以2节点为头的左子树的高度为2,右子树高度为0.
题目
给定一个二叉树的头节点head,判断该二叉树是否是平衡二叉树,如果是,返回平衡二叉树的深度,如果不是,返回false;
思路
对头节点head,分别遍历左右子树。遍历中记录:(1)该子树是否是平衡二叉树;(2)该子树的最深一层的层数
如果发现左子树不是平衡二叉树,返回上一层递归函数,设置记录值为false;
如果左子树是平衡二叉树,记录最深一层层数为LH,遍历右子树,记录(1)右子树是否为平衡二叉树(2)右子树最深一层层数,记为RH
如果右子树不是平衡二叉树,返回上一层递归函数,设置记录值为false;
如果head的左、右子树是平衡二叉树,计算LH和RH差值的绝对值,如果绝对值大于1,则返回false;如果不大于1,则返回LH与RH中较大的一个作为以head为头节点的二叉树的深度。
这道题用递归实现起来会非常方便,同时很多二叉树的面试题都是对二叉树遍历问题的改写。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class CheckBalance {
public:
int getDepth(int label, TreeNode *root, bool&judge) {
if (root == NULL)
return (label-1);
else if (root->left == NULL &&root->right == NULL)
return label;
int LH = getDepth(label + 1, root->left, judge);
//如果左子树不是平衡二叉树,直接返回false
if(!judge)
return label;
int RH = getDepth(label + 1, root->right, judge);
if(!judge)
return label;
if (abs(LH - RH)>1)
judge = false;
return max(LH, RH);//返回当前以root为头节点的树的深度
}
bool check(TreeNode* root) {
// write code here
bool judge = true;
int label = 1;
if (root == NULL)
return true;//空树是一棵平衡二叉树
getDepth(label, root, judge);
return judge;
}
};