判断一棵树是否是平衡二叉树

struct TreeNode{  
    TreeNode *leftChild;  
    TreeNode *rightChild;  
    int data;  
};  
  
int getHeight(const TreeNode* root){  
    if( root == nullptr){  
        return 0;  
    }  
      
    return max(getHeight(root->leftChild), getHeight(root->rightChild)) + 1;  //返回一个节点左右子树的最大高度。
}  
  
bool isBalanced(const TreeNode* root){  
    if( root == nullptr){  
        return true;  //根为控返回true即平衡
    }  
      
    int heightDiff = abs(getHeight(root->leftChild) - getHeight(root->rightChild));  //判断左右最大子树是否为平衡
    if( heightDiff > 1){  
        return false;  
    }  
    else{  
        return isBalanced(root->leftChild) && isBalanced(root->rightChild);  //如果平衡,判断左子树是否为平衡,右子树是否为平衡。递归到最后一层,若无false为则为平衡二叉树。
    }  
}
    --------------------- 

改进后的代码,省去每次递归都需要计算子树长度。

int checkHeight(const TreeNode* root){  
    if( root == nullptr){  
        return 0;  
    }  
    // check the left subtree is balanced or not.  
    int leftHeight = checkHeight(root->leftChild);  //接收 最大高度,或者非平衡树返回值。
    if( leftHeight == -1 ){  
        return -1;  
    }  
      
    // check the right subtree is balanced or not.  
    int rightHeight = checkHeight(root->rightChild);  
    if( rightHeight == -1){  
        return -1;  
    }  
      
    // check the current tree is balanced or not.  
    int diff = leftHeight - rightHeight;  //判断左右子树高度差,若不平衡返回-1。
    if( abs(diff) > 1){  
        return -1;  
    }  
    else{  
        // return the tree height.  
        return max(leftHeight, rightHeight) + 1;  //否则返回子树的最大高度给节点。
    }  
}  
bool isBalanced(const TreeNode* root){  
    return ( checkHeight(root) == -1 )? false:true;  //判断树是否平衡。
} 

转载于:https://www.cnblogs.com/anzhsoft/p/3602982.html
作者:anzhsoft

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值