OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2525|回复: 0

判断AVL树是否平衡 收藏方便找到该网站

[复制链接]

143

主题

145

帖子

0

精华

高级会员

Rank: 4

积分
585
金钱
585
注册时间
2020-5-25
在线时间
42 小时
发表于 2020-9-9 17:06:31 | 显示全部楼层 |阅读模式
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;
}
这种解法是由下向上的进行的,先求出子树的高度,然后每向上一层子树高度加一并且判断一次二叉树是否平衡,如果平衡返回值为真再继续判断,为假则二叉树不是平衡二叉树。这种方法代码没有递归的代码直观但是时间复杂度降低了。
有相同爱好的可以进来一起讨论哦:企鹅群号:1046795523


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-17 12:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表