判断AVL树是否平衡

     AVL树是高度的平衡二插搜索树,其左子树和右子树的高度之差不超过1(树中的左子树和右子树都是AVL树),维持这个高度之差就要控制它的平衡因子。那么判断一颗AVL树是否平衡就需要判断它的左子树和右子树高度差是否为1,并且子树也遵循这个原则。这里我们可以用递归的方法来判断这颗二叉树是否为平衡二叉树,看他的左右子树之差是否不超过1.代码如下:

bool IsBalance(Node* parent)
    {
        if (parent == NULL)
            return true;

        int rightHight = _Hight(parent->_right);    //右树的高度
        int leftHight = _Hight(parent->_left);        //左树的高度
        return abs(rightHight - leftHight) < 2 && IsBalance(parent->_left) && IsBalance(parent->_right);    //判断左右子树绝对值是否小于2并递归
    }

求高度的函数如下:

int _Hight(Node* node)
    {
        if (node == NULL)
            return 0;

        int right = _Hight(node->_right) + 1;
        int left = _Hight(node->_left) + 1;

        return right>left ? right : left;
    }

这样的代码很容易理解也能到达求AVL树是否平衡但是由于是递归这个解法的时间复杂度比较高。那么有没有时间复杂度更优的解法呢?这里我们采用一种非递归的解法,代码如下:

bool IsBalence()
{
    int hight = 0;              //高度
    return _IsBalece(_root, hight);
}

bool _IsBalence(Node* parent, int &hight)
{
    if (parent == NULL)
    {
        hight = 0;
        return true;
    }

    lefthight = 0;
    if (_IsBalence(parent->_left, lefthight) == false)
        return false;

    righthight=0;
    if (_IsBalence(parent->_right, righthight) == false)
        return false;

    hight = righthight > lefthight ? righthight + 1 : lefthight + 1;
    return abs(righthight - lefthight) < 2;
}

这种解法是由下向上的进行的,先求出子树的高度,然后每向上一层子树高度加一并且判断一次二叉树是否平衡,如果平衡返回值为真再继续判断,为假则二叉树不是平衡二叉树。这种方法代码没有递归的代码直观但是时间复杂度降低了。

posted @ 2016-10-26 20:53  请叫我小小兽  阅读(2824)  评论(2编辑  收藏  举报