判定一颗二叉树是否是平衡二叉树(AVL)

如题 自用笔记 如有错误欢迎及时指正

问题:给定一个二叉树,判定是否为平衡二叉树?

判定AVL:可以采用递归方式求出每个结点的左右子树高度,当任一结点左右子树高度差的绝对值小于等于1时,则满足avl的要求。

                空树 是avl

                非空树 左右子树均为avl

算法实现

bool IsAVL(BiTree T,int &h){            //h为树高度

    bool isLeft, isRight;       //保存左右子树的判定状态

    int hLeft, hRight;      //保存左右子树高度
    if(!T){
        h = 0;
        return true;        //空树是AVL
    }
    
    isLeft = IsAVL(T->lchild, hLeft);       //求左子树高 判断左子树满足avl
    isRight = IsAVL(T->rchild, hRight);     //求右子树高 判断右子树满足avl
    h = (hLeft > hRight ? hLeft : hRight) + 1;      //保存二叉树高度

    //核心部分

/*     if(isLeft==true&&isRight==true&&abs(hLeft-hRight)<=1){
        return true;
    }else{
        return false;
    } */
    //简洁写法
    return (isLeft == true && isRight == true && abs(hLeft - hRight) <= 1 ? true : false);
}

最优解法

bool isBalanced(BiTree root) {
    	//此时如果根节点的左右深度之差的返回值不为-1,即为正确的
        return Function(root)!=-1;
}
int Function(BiTree root){
        if(!root)return 0;

        //返回左(右)子树的深度,如果其深度为-1(默认不平衡),则全树不平衡
        int left=Function(root->lchild);
        if (left==-1)return -1;

        int right=Funtion(root->rchild);
        if (right==-1)return -1;
   
        return abs(left-right)<2?max(left,right)+1:-1;
}

存储结构与基本函数定义

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 10
typedef int DataType;
 
// 二叉树存储结构 二叉链式
typedef struct BiTNode{
    DataType data;  //数据域
    struct BiTNode *lchild;
    struct BiTNode *rchild;
} BiTNode, *BiTree; //重命名
 
typedef BiTree ElemType;
 
//操作函数 负责visit
inline void visit(BiTree p){
    printf("%d ", p->data);
}
 
//二叉树建立二叉链式
void CreateBiTree_BiTNode(BiTree &T){       
    DataType ch;     
    scanf("%d",&ch);
    //输入二叉树数据   
    if(ch==0) { //判断是否为空        
        T=NULL;
    }else {
        T=(BiTNode *)malloc(sizeof(BiTNode));  //二叉树的生成       
        T->data=ch;
            printf(" 二叉树新建节点并已插入数据%d",T->data);
            printf("\n");
        CreateBiTree_BiTNode(T->lchild);   
        CreateBiTree_BiTNode(T->rchild);     
    }    
}  

//层序遍历
void LevelTraverse(BiTree T){
    SqQueue Q;
    InitQueue(Q);
    BiTree p; //工作指针 保存出队元素负责访问
    
    EnQueue(Q, T);      //根节点入队
    while(!QueueEmpty(Q)){      
        DeQueue(Q, p);      //出队交给p       
        visit(p);    //访问
        if(p->lchild){      //左孩子不空入队
            EnQueue(Q, p->lchild);
        }
        if(p->rchild){                       
            EnQueue(Q, p->rchild);
        }
    }
}
 
//==============================================辅助队列
 
 
//存储结构循环队列
typedef struct{
    ElemType data[MaxSize];
    int front;          //队头
    int rear;           //队尾
} SqQueue;
//初始化
void InitQueue(SqQueue &q){
    q.front = q.rear = 0;
}
 
bool QueueEmpty(SqQueue q){
    if(q.front==q.rear){
        return true;
    }else{
        return false;
    }
}
 
//入队
bool EnQueue(SqQueue &q,ElemType x){
    if((q.rear+1)%MaxSize==q.front){        //队列已满
        return false;
    }
    q.data[q.rear] = x;
    q.rear = (q.rear + 1) % MaxSize;        //移动队列尾
    return true;
}
 
//出队
bool DeQueue(SqQueue &q,ElemType &x){
    if(q.front==q.rear){
        return false;
    }
    x = q.data[q.front];
    q.front = (q.front + 1) % MaxSize;
    return true;
}

//function

int main(){

    BiTree T1;
    CreateBiTree_BiTNode(T1);
    printf("二叉树T1为:\n");
    LevelTraverse(T1);

    int h=0;
    bool IS = IsAVL(T1,h);
    printf("\n");
    if(IS==true){
        printf("是AVL");
    }else{
        printf("不是AVL");
    }

    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值