判断是否为完全二叉树,平衡二叉树,二叉排序树

20 篇文章 0 订阅
17 篇文章 0 订阅
//完全二叉树
//判断是否为完全二叉树
//思想:采用层次遍历,将所有的结点入队(包括空结点),当遇见空结点时,查看其后面的结点是否有非空结点,
//若有非结点,则不是完全二叉树

bool isComplete(Tree T)
{
    queue<Tree> Q;

    Tree p;

    if(T == NULL)
        return true;

    Q.push(T);//根节点入队

    while(!Q.empty())
    {
        p = Q.front();//队头出队
        Q.pop();

        if(p)
        {
            //左右孩子结点入队列
            Q.push(T->lchild);
            Q.push(T->rchild);

        }
        else
        {
            while(!Q.empty())
            {
                p = Q.front();//队头出队
                Q.pop();
                if(p)
                    return false;
            }
        }//end else
    }//end while

    return true;

}//end isComplete



/*
    平衡二叉树
*/

//判断是否为二叉排序树
typedef struct BSTNode{
    int data;
    BiNode *lchild,*rchild;
}BSTNode,*BSTTree;

int predata = -32767;

int judgeBST(BSTTree bt)
{


    int bl = 0,br = 0;//用已记录左右子树是否为二叉排序树

    if(bt == NULL)//空树是二叉排序树
        return 1;

    else{
        bl = judgeBST(bt->lchild);//递归判断左子树

        if(bl == 0||predata>=bt->data)//左子树不是二叉排序树,或则不满足二叉排序树的定义
            return 0;

        predata = bt->data;//更新

        br = judgeBST(bt->rchild);//递归判断右子树

        return br;

    }
}//end judgeBST

/*
    判断是否为平衡二叉树
    思想:递归统计左右子树的高度差{-1,0,1}之间
    采用后序遍递归遍历
*/

void judgeAVL(Tree bt,int &balance,int &h)//balance 为平衡因子
{
    int bl=0,br = 0;//左右子树的平衡因子
    int hl=0,hr = 0;//左右子树的高度

    if(bt == NULL)//空树为平衡二叉树
    {
        balance = 1;
        h =0;//树的高度为0
        return;
    }

    else if(bt->lchild == NULL&&bt->rchild == NULL)//只有一个节点
    {
        h =1;
        balance = 1;
        return ;
    }

    else{

        judgeAVL(bt->lchild,bl,hl);//递归判断左子树

        judgeAVL(bt->rchild,br,hr);//递归判断右子树

        h = (h1>hr?hl:hr) +1;

        if(abs(hl-hr)<2)//计算平衡因子
            balance = bl&&br;//左右子树都是平衡二叉树时这颗树才是平衡二叉树
        else
            balance = 0;

    }//end else

}//end judgeAVL

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值