• 判断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;
    }

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

  • 相关阅读:
    PHP单引号和双引号的区别
    thinkphp实现导航高亮的简单方法
    js选中当前菜单后高亮显示的导航条
    Dubbo新版管控台
    把本人基于Dubbo的毕业设计分享粗来~
    Windows 查看端口占用情况
    GitLab 环境搭建【CentOS7】
    【非专业前端】vue+element+webpack
    【非专业前端】使用vue2.5.17+element2.4.5
    ElasticSearch6.3.2------入门
  • 原文地址:https://www.cnblogs.com/qingjiaowoxiaoxioashou/p/6001869.html
Copyright © 2020-2023  润新知