力扣刷题:求树的最大高度,树的最小高度,与判断平衡二叉树

力扣刷题:求树的最大高度,树的最小高度,与判断平衡二叉树_第1张图片

解题思路:这里我们考虑用递归方式解题。递归判断当前元素是否为空,如果为空,返回 0 。(讲到这里我们知道这个条件是递归的结束条件,防止递归无限执行下去)如果不为空我们返回左右子树中树高最高的值再加 1 。
代码如下

int maxDepth(struct TreeNode* root){
    if(root==NULL) //若果当前节点为空,返回0
        return 0;
    else
    {
        return fmax(maxDepth(root->left),maxDepth(root->right))+1; //不为空的时候返回左右子树高度的最大值 + 1
    }
}

力扣刷题:求树的最大高度,树的最小高度,与判断平衡二叉树_第2张图片

解题思路:这个题目要用到上个题的求树的最大深度部分。平衡二叉树对左右子树高度差要求不超过1,且每个子树都是平衡二叉树。这里我们又可以用递归思想。即对每个节点求其左右子树的最大深度,然后判断这个节点的左右子树高度差是否小于等于 1并递归判断这个节点的左右子树是否是平衡二叉树。

int height(struct TreeNode* root){
    if(root == NULL){
        return 0;
    }
    return fmax(height(root->left),height(root->right))+1;
}
bool isBalanced(struct TreeNode* root){
    if(root==NULL)
    {
        return true;
    }
    return fabs(height(root->left)-height(root->right)) <=1 && isBalanced(root->left)&&isBalanced(root->right);
}

力扣刷题:求树的最大高度,树的最小高度,与判断平衡二叉树_第3张图片
解题思路:这个题并非是用递归求出左右子树的高度然后取最小值这么简单。这个题要考虑几种情况:①树为空②只有右子树 ③只有左子树④如果我们用上面那种求高度的递归算法来写的话,左右子树都有和左右子树都没有是一种情况,发现没?用fmin(左子树高度,右子树高度)+1这个求树高的方法时,当左右子树都没有时返回1,即此时的树只有一个节点,当根节点的左右子树都有的时候返回左右子树中最小的高度。下面看代码

int minDepth(struct TreeNode* root){
    if(root==NULL)
    {
        return 0;
    }
    if(root->left==NULL){ //只有右子树,递归求右子树的最小高度
        return minDepth(root->right)+1;
    }
    else if(root->right==NULL) //只有左子树,递归求左子树的最小高度
    {
        return minDepth(root->left)+1;
    }
    else return fmin(minDepth(root->left),minDepth(root->right))+1;
}

以上便是一些简单的求二叉树深度和判断平衡二叉树的例子。

你可能感兴趣的:(二叉树,算法)