判断一颗二叉树树是否为AVL树

1)先判断该树是否为二叉排序树,也可以采用中序遍历该树,判断是否有序

2)判断该树是否为平衡树

代码如下:

struct TreeNode
{
    struct TreeNode *left;
    struct TreeNode *right;
    int key;
};
//这里先判断是否为二叉搜索树,其次判断是否为平衡的
bool IsAVL(TreeNode *root,int depth)
{
    if (isBST(root)&&isBalance(root,&depth))
    return true;
    return false;
}

//判断是否为二叉搜索树
bool isBST(TreeNode *root)
{
    if(root == NULL)return true;
    if (!isBST(root->left))return false;
    if (!isBST(root->right))return false;
    TreeNode *cur = root->left;
    if (cur != NULL)
    {
        while(cur->right!=NULL)cur = cur->right;
        if(root->key < cur->key)return false;
    }
    TreeNode *cur = root->right;
    if (cur != NULL)
    {
        while(cur->left!=NULL)cur = cur->left;
        if(root->key > cur->key)return false;
    }
    return true;
}

//判断是否平衡
bool isBalance(TreeNode *root,int *depth)
{
    if (root == NULL)
    {
        *depth = 0;
        return true;
    }
    int depthl,depthr;
    if(!isBalance(root->left,&depthl))return false;
    if(!isBalance(root->right,&depthr))return false;
    int diff = depthl - depthr;
    if(diff > 1 || diff < -1)return false;
    *depth = 1+(depthl>depthr?depthl:depthr);
    return true;
}

转载地址:http://www.cnblogs.com/newpanderking/p/3969557.html

在C++中,创建一颗AVL通常包含以下几个步骤: 1. 定义数据结构:首先,你需要定义一个二叉树节点结构,包含一个值(通常是整型或指针)、指向左子节点和右子节点的指针,以及一个用于存储高度信息的成员变量。 ```cpp template <typename T> struct AVLNode { T value; AVLNode<T> *left, *right; int height; }; ``` 2. 插入操作:插入新节点后,会递归地计算每个节点的新高度,并判断是否需要旋转来保持AVL的平衡。插入过程分为两步:首先正常插入,然后检查平衡条件并进行旋转。 ```cpp void insert(AVLNode<T> *&root, const T &value) { // ... (插入代码) if (不平衡(root)) { // 根据不平衡的情况进行适当的旋转 root = rotate(root); } } bool isBalanced(const AVLNode<T> *node) { if (!node) return true; int leftHeight = node->left->height; int rightHeight = node->right->height; return abs(leftHeight - rightHeight) <= 1 && isBalanced(node->left) && isBalanced(node->right); } AVLNode<T> *rotate(AVLNode<T> *&node) { /* 根据不平衡情况执行左旋或右旋 */ } ``` 3. 旋转操作:具体的旋转函数(如`rotate()`)根据不平衡情况选择相应的旋转类型,比如左旋(LL、LR),右旋(RR、RL)。这涉及到对节点指针的更新和一些递归逻辑。 4. 搜索、删除等操作:除了插入,其他操作(如查找、删除)也需要处理不平衡情况下的旋转,原理大致相似。 完成以上步骤后,每次对AVL进行修改都会自动触发必要的平衡调整,使得保持其高度平衡的特性。记得在实现过程中遵守模板特化和通用设计原则,同时考虑内存管理和性能优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值