平衡二叉树(C语言)

 题目描述:

 平衡二叉树是指左右子树高度相差小于等于1的二叉树。

方法一:

思路

由题意可知平衡二叉树为左右子树高度差小于等于1,我们将问题拆解,求出左子树的高度,再求出右子树的高度,求二者相减的绝对值,大于1则返回false,判断完后,再判断其左右子树,递归下去。

解题过程

1.完成左右子树的高度计数,找到树的高度。
2.计算左右子树的差,判断是否为平衡二叉树。
3.递归下一左右子树。

 代码实现:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

int TreeDepth(struct TreeNode* root)
{
    if(root == NULL)
    {
        return 0;
    }
    
    int leftDepth = TreeDepth(root->left);
    int rightDepth = TreeDepth(root->right);

    return leftDepth > rightDepth ?leftDepth+1:rightDepth+1;
}

//时间复杂度为O(N*N)
bool isBalanced(struct TreeNode* root) {
    if(root==NULL)
    return true;

    int gap=TreeDepth(root->left)-TreeDepth(root->right);
    if(abs(gap) > 1)
    {
        return false;
    }
 
    return isBalanced(root->left)&&isBalanced(root->right);
}

 这个方法容易想到,但是时间复杂度太高,为O(N*N),出现了重复计算,因此我们可以选择优化这个代码,将时间复杂度变为O(N)。

方法二:

思路

这种方法利用了后序的思路,先检查左右子树,从叶子节点开始检查,依次向上检查,如果不是平衡二叉树,则返回错误,是平衡二叉树,则返回正确,同时返回高度。

解题过程

1.创建一个函数,参数有结构体和整形,因为要传递树的高度所以参数要整形。
2.函数里判断左右子树递归,判断是否为平衡二叉树,不是则返回false。
3.判断其是平衡二叉树则返回高度。

 代码实现:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

int _isBalanced(struct TreeNode* root,int* pdepth)
{
    if(root == NULL)
    return true;
    else
    {
      int leftDepth = 0;
      if(_isBalanced(root->left,&leftDepth) == false)
      {
        return false;
      }
      int rightDepth = 0;
      if(_isBalanced(root->right,&rightDepth) == false)
      {
        return false;
      }
      
      if(abs(leftDepth-rightDepth) > 1)
      {
        return false;
      }
      
      *pdepth=leftDepth > rightDepth ? leftDepth+1:rightDepth+1;
      return true;
    }

}

//时间复杂度为O(N)
bool isBalanced(struct TreeNode* root) {
    int depth = 0;
    return _isBalanced(root,&depth);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值