| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 531 人关注过本帖
标题:那位大神给个平衡二叉树的代码给小弟参考参考下
只看楼主 加入收藏
清风拂晓
Rank: 8Rank: 8
来 自:火星
等 级:蝙蝠侠
威 望:1
帖 子:356
专家分:889
注 册:2010-8-13
结帖率:96.15%
收藏
已结贴  问题点数:20 回复次数:2 
那位大神给个平衡二叉树的代码给小弟参考参考下
那位大神给个平衡二叉树的代码给小弟参考参考下
搜索更多相关主题的帖子: 二叉树 平衡 
2011-02-20 20:54
清风拂晓
Rank: 8Rank: 8
来 自:火星
等 级:蝙蝠侠
威 望:1
帖 子:356
专家分:889
注 册:2010-8-13
收藏
得分:0 
没人

清风拂暮(木)
2011-02-21 17:05
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:20 
程序代码:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

#define MAX 10
#define ADD 5

typedef struct node
{
    int bf;//平衡因子
    int data;//结点存储的数据
    int depth;//结点的深度
    struct node *lchild, *rchild;
}*AVL_T;

typedef struct
{
    AVL_T *base;
    AVL_T *top;
    int stack_size;
}AVL_Stack;

typedef struct
{
    AVL_T *base;
    int front;
    int rear;
    int q_size;
}AVL_Queue;


/*

 *判断二叉树是否平衡 平衡返回1值 否则返回0值

 */
int Balance( AVL_T T )
{
    if( T )
    {
        if( abs(T->bf) > 1 )
        {
            return 0;
        }
        else
        {
            return Balance(T->rchild) | Balance(T->lchild);
        }
    }
    else
    {//当为空树的时候 为平衡状态
        return 1;
    }
}
/*

 *计算出数的平衡因子

 */
void Count_bf( AVL_T T )
{
    if( T )
    {
        int l, r;
        if( T->rchild )
        {
            r = T->rchild->depth;
        }
        else
        {
            r = 0;
        }
        if( T->lchild )
        {
            l = T->lchild->depth;
        }
        else
        {
            l = 0;
        }

        T->bf = l - r;

        Count_bf( T->lchild );
        Count_bf( T->rchild );
    }
}
/*

 *得出两个整数中较大的那个数

 */
int Max( int a, int b )
{
    return a>b?a:b;
}
/*

 *计算树中结点的深度

 */
int Count_depth( AVL_T T )
{
    if( T )
    {
        return T->depth = 1 + Max( Count_depth(T->rchild), Count_depth(T->lchild) );
    }
    else
    {
        return 0;
    }
}
/*

 *查找p的双亲 找到就赋值为f 否则f为NULL 找到则返回1 否则返回0

 */
int Searchf( AVL_T T, AVL_T &f, int p )
{
    if( T )
    {
        if( T->data == p )
        {
            f = NULL;
            return 0;
        }
        else if( T->data > p )
        {
            if( T->lchild )
            {
                if( T->lchild->data == p )
                {
                    f = T;
                    return 1;
                }
                else
                {
                    Searchf( T->lchild, f, p );
                }
            }
            else
            {
                f = NULL;
                return 0;
            }
        }
        else
        {
            if( T->rchild )
            {
                if( T->rchild->data == p )
                {
                    f = T;
                    return 1;
                }
                else
                {
                    Searchf( T->rchild, f, p );
                }
            }
            else
            {
                f = NULL;
                return 0;
            }
        }
    }
    else
    {
        f = NULL;
        return 0;
    }
}
/*

 *找到和i相同的返回1  否则0

 */
int Search_AVL( AVL_T T, int i, AVL_T &p )
{
    if( T )
    {
        p = T;
        if( T->data == i )
        {
            return 1;
        }
        else if( i > T->data )
        {
            return Search_AVL( T->rchild, i, p );
        }
        else
        {
            return Search_AVL( T->lchild, i, p );
        }
    }
    else
    {
        return 0;
    }
}
/*

 *在树种插入结点i

 */
int Insert_AVL( AVL_T &T, int i )
{
    AVL_T p;

    if( !Search_AVL( T, i, p ) )
    {//表示相同的结点值是不进行插入操作
        AVL_T temp;
        temp = (AVL_T) malloc (sizeof(AVL_T));
        temp->bf = 0;
        temp->data = i;
        temp->depth = 1;
        temp->lchild = temp->rchild = NULL;
        if( !T )
        {
            T = temp;
        }
        else if( p->data > i )
        {
            p->lchild = temp;
        }
        else
        {
            p->rchild = temp;
        }
    
        return 1;
    }
    else
    {
        return 0;
    }
}
///////////栈的操作///////////////////////
void Init_Stack( AVL_Stack &S )
{
    S.base = (AVL_T*) malloc (MAX*sizeof(AVL_T));
    if( !S.base )
        exit(0);
    S.top = S.base;
    S.stack_size = MAX;
}

void Push_Stack( AVL_Stack &S, AVL_T temp )
{
    if( S.top - S.base >= S.stack_size )
    {
        S.base = (AVL_T*) realloc (S.base, (ADD+S.stack_size)*sizeof(AVL_T));
        S.top = S.base + S.stack_size;
        S.stack_size += ADD;
    }
    *S.top++ = temp;
}    

void Pop_Stack( AVL_Stack &S, AVL_T &temp )
{
    if( S.base == S.top )
        return;
    temp = *--S.top;
}

int Empty_Stack( AVL_Stack S )
{
    if( S.base == S.top )
        return 1;
    else
        return 0;
}
/////////////

///////////队的基本操作/////////////////
void Init_Queue( AVL_Queue &Q )
{
    Q.base = (AVL_T *) malloc (MAX*sizeof(AVL_T));
    if( !Q.base )
        exit( 0 );
    Q.front = Q.rear = 0;
    Q.q_size = MAX;
}

void Enter_Queue( AVL_Queue &Q, AVL_T temp )
{
    if( Q.rear >=  Q.q_size-1 )
    {
        Q.base = ( AVL_T * ) realloc (Q.base,(Q.q_size+ADD)*sizeof(AVL_T));
        if( !Q.base )
            exit( 0 );
        Q.q_size += ADD;
    }
    Q.base[Q.rear++] = temp;
}

void Delete_Queue( AVL_Queue &Q, AVL_T &temp )
{
    if( Q.front == Q.rear )
        return ;
    temp = Q.base[Q.front++];
}

int Empty_Queue( AVL_Queue Q )
{
    if( Q.front == Q.rear )
        return 1;
    else
        return 0;
}

void Destroy_Queue( AVL_Queue &Q )
{
    if( Q.base )
    {
        free( Q.base );
        Q.front = Q.rear = 0;
        Q.q_size = 0;
    }
}
/*

 *将所有的不平衡的点压入栈S中 层序遍历

 */
void Traverse_AVL( AVL_T T, AVL_Stack &S )
{
    AVL_Queue Q;
    AVL_T temp;

    Init_Queue( Q );
    if( T )
    {
        Enter_Queue( Q, T );
        while( !Empty_Queue( Q ) )
        {
            Delete_Queue( Q, temp );
            if( abs( temp->bf ) > 1 )
                    Push_Stack( S, temp );
            if( temp->lchild )
                Enter_Queue( Q, temp->lchild );
            if( temp->rchild )
                Enter_Queue( Q, temp->rchild );
        }
    }
}


/*

 *进行调整

 */
void Change_AVL( AVL_T &T )
{
    AVL_Stack S;//压入所有的不平衡点
    AVL_T f = NULL;//如果不为NULL 就表示当前不平衡点的双亲
    AVL_T p;//表示当前不平衡点
    AVL_T pl, pr;//表示当前不平衡点的左、右孩子
    AVL_T plr, prl;//表示当前不平衡点的左(右)孩子的右(左)孩子

    Init_Stack( S );
    Traverse_AVL( T, S );
    Pop_Stack( S, p );
    Searchf( T, f, p->data );
    if( p->bf == 2 )//L
    {
        pl = p->lchild;
        plr = pl->rchild;
        if( f == NULL )
        {
            if( pl->bf == 1 )//L
            {
                p->lchild = pl->rchild;
                pl->rchild = p;
                T = pl;
            }
            else if( pl->bf == -1 )//R
            {
                p->lchild = plr->rchild;
                pl->rchild = plr->lchild;
                plr->rchild = p;
                plr->lchild = pl;
                T = plr;
            }
            else if( pl->bf == 0 )
            {
                p->lchild = pl->rchild;
                pl->rchild = p;
                T = pl;
            }
        }
        else
        {
            if( pl->bf == 1 )//L
            {
                p->lchild = pl->rchild;
                pl->rchild = p;
                if( f->data > p->data )
                    f->lchild = pl;
                else
                    f->rchild = pl;
            }
            else if( pl->bf == -1 )//R
            {
                p->lchild = plr->rchild;
                pl->rchild = plr->lchild;
                plr->rchild = p;
                plr->lchild = pl;
                if( f->data > p->data )
                    f->lchild = plr;
                else
                    f->rchild = plr;
            }
            else if( pl->bf == 0 )
            {
                p->lchild = pl->rchild;
                pl->rchild = p;
                if( f->data > p->data )
                    f->lchild = pl;
                else
                    f->rchild = pl;
            }
        }
    }
    else if( p->bf == -2 )//R
    {
        pr = p->rchild;
        prl = pr->lchild;
        if( f == NULL )
        {
            if( pr->bf == -1 )//R
            {
                p->rchild = pr->lchild;
                pr->lchild = p;
                T = pr;
            }
            else if( pr->bf == 1 )//L
            {
                p->rchild = prl->lchild;
                pr->lchild = prl->rchild;
                prl->lchild = p;
                prl->rchild = pr;
                T = prl;
            }
            else if( pr->bf == 0 )
            {
                p->rchild = pr->lchild;
                pr->lchild = p;
                T = pr;
            }
        }
        else
        {
            if( pr->bf == -1 )//R
            {
                p->rchild = pr->lchild;
                pr->lchild = p;
                if( f->data > p->data )
                    f->lchild = pr;
                else
                    f->rchild = pr;
            }
            else if( pr->bf == 1 )//L
            {
                p->rchild = prl->lchild;
                pr->lchild = prl->rchild;
                prl->lchild = p;
                prl->rchild = pr;
                if( f->data > p->data )
                    f->lchild = prl;
                else
                    f->rchild = prl;
            }
            else if( pr->bf == 0 )//
            {
                p->rchild = pr->lchild;
                pr->lchild = p;
                if( f->data > p->data )
                    f->lchild = pr;
                else
                    f->rchild = pr;
            }
        }
    }
}
/*

 *打印结果

 */
void Show( AVL_T T )
{
    if(T)
    {
        printf("%d %d %d\n", T->data, T->depth, T->bf);
        Show( T->lchild );
        Show( T->rchild );
    }
}

int main()
{
    AVL_T T = NULL;
    int temp;

    while( scanf("%d", &temp) )
    {
        if( Insert_AVL(T, temp) )//插入成功返回1值
        {
            Count_depth(T);
            Count_bf(T);
            while( !Balance(T) )
            {//到达平衡时才退出
                Change_AVL(T);
                Count_depth(T);
                Count_bf(T);
            }
        }
    }
    Show( T );

    return 0;
}
图片附件: 游客没有浏览图片的权限,请 登录注册
没有删除操作
2011-02-22 19:50
快速回复:那位大神给个平衡二叉树的代码给小弟参考参考下
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026235 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved