数据结构面试题/判断一棵二叉树是否是平衡二叉树

AVL树概念:如果一棵二叉搜索树是高度平衡的,它就是AVL树。如果它有N个结点,其高度可保持在O(lgn),平均搜索时间复杂度O(lg(n)).
一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树:
1.它的左右子树都是AVL树;
2.左子树和右子树高度之差(简称平衡因子)的绝对值不超过1.
先定义一个二叉树的结构体:

template<class K, class V>   //键值队
struct AVLTreeNode
{
    AVLTreeNode(const K& key, const V& value)
        : _pLeft(NULL)
        , _pRight(NULL)
        , _pParent(NULL)
        , _key(key)
        , _value(value)
        , _bf(0)  
    {}

    AVLTreeNode<K, V>* _pLeft;
    AVLTreeNode<K, V>* _pRight;
    AVLTreeNode<K, V>* _pParent;  //结点的双亲
    K _key;
    V _value;
    int _bf;   //平衡因子--检测树的平衡
};

判断下面一棵二叉树是否是平衡二叉树:
这里写图片描述

根据左右子树的深度判断是否是AVL树(即平衡二叉树),递归实现


     bool IsBalanceTree()
    {
        return _IsBalanceTree(_pRoot);
    }

    //判断一棵树是否是平衡二叉树--每个结点的平衡因子
    bool _IsBalanceTree(Node* pRoot)
    {
        //前序 -- 空树
        if (NULL == pRoot)
            return true;
        //检测根的平衡
        size_t leftHeight = _Height(pRoot->_pLeft);
        size_t rightHeight = _Height(pRoot->_pRight);
        if (rightHeight - leftHeight != pRoot->_bf || abs(pRoot->_bf) > 1)
        {
            cout << pRoot->_key << "-->_bf=" << pRoot->_bf << endl;
            return false;
        }
        return _IsBalanceTree(pRoot->_pLeft) && _IsBalanceTree(pRoot->_pRight);
    }

    size_t _Height(Node* pRoot)
    {
        if (NULL == pRoot)
            return 0;
        if (NULL == pRoot->_pLeft && NULL == pRoot->_pRight)
            return 1;
        size_t leftHeight = _Height(pRoot->_pLeft);
        size_t rightHeight = _Height(pRoot->_pRight);
        return (rightHeight - leftHeight);
    }

结果是:
这棵树不是AVL树。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值