首先明确二叉树的高度和深度是两个不同的概念,深度是从上到下的,高度是从下到上的
深度:从根节点到该节点的最长简单路径边的条数
高度:从该节点到叶子节点的最长简单路径边的条数
因此求深度可用前序遍历(中左右),而求深度则使用后序遍历(左右中)
逻辑如下:传入参数是当前遍历的节点,返回值是当前子树的高度,若返回值为-1,则当前节点为根节点的子树不是平衡二叉树,此二叉树也不是平衡二叉树
判断此二叉树是否为平衡二叉树看左右子树高度差是否大于1,若大于则不是;若小于1,则当前节点的高度为1+左右子树中较大的高度(叶子结点的左右子树高度都为0 ,因此叶子结点高度是1,高度的返回值每次增加1)
class Solution {
public:
int getHeigh(TreeNode* root){
if(root == nullptr){
return 0;
}
int lHeight = getHeigh(root->left);
if(lHeight == -1) return -1;
int rHeight = getHeigh(root->right);
if(rHeight == -1) return -1;
int res = abs(lHeight - rHeight) > 1 ? -1 : 1 + max(lHeight, rHeight);//高度每次增加1
return res;
}
bool isBalanced(TreeNode* root) {
int res = getHeigh(root);
if(res != -1) return true;
return false;
}
};