判斷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 : lefthight;
    return abs(righthight - lefthight) < 2;
}

這種解法是由下向上的進行的,先求出子樹的高度,然后每向上一層子樹高度加一並且判斷一次二叉樹是否平衡,如果平衡返回值為真再繼續判斷,為假則二叉樹不是平衡二叉樹。這種方法代碼沒有遞歸的代碼直觀但是時間復雜度降低了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM