| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5305 人关注过本帖
标题:AVL树(迭代版本)
取消只看楼主 加入收藏
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
结帖率:95.65%
收藏
已结贴  问题点数:100 回复次数:20 
AVL树(迭代版本)
这并不是高效的迭代版本,原来在于使用了绝对高度,而对高度函数的两次调用让迭代获得的些许速度优势荡然无存。

目前还没想到怎么处理高度,如果你有好的建议,请提出,不胜感谢。

程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define T AVLTREE
typedef struct T *T;

struct T {
    int Element;
    T Left;
    T Right;
};

void
Insert( T *RootPP, int X ); 

void
Print( T Root );



int
main( void )
{
    T Root;
    int ix,i;

    Root = NULL;
    srand( ( unsigned )time( NULL ) );


    for( ix = 0; 20 > ix; ++ix )
        i = rand() % 1000, fprintf( stderr,"待插入的值是 %d\n", i ), Insert( &Root, i );

    Print( Root );

    return 0;
}

void
Print( T Root )
{
    if( NULL == Root )
        return;


    Print( Root->Left );
    printf( "%5d ", Root->Element );
    Print( Root->Right );
}


int
Heigh( T Root );

T
SingleRotateWithLeft( T Node );
T
SingleRotateWithRight( T Node );
T
DoubleRotateWithLeft( T Node );
T
DoubleRotateWithRight( T Node );


void
Insert( T *RootPP, int X )
{
    T New;
    T Next;
    T *This;
    int L_Heigh, R_Heigh;

    This = RootPP;

    while( NULL != ( Next = *This ) ) 
    {
        if( X > Next->Element )

            This = &Next->Right;
        else if( X < Next->Element )

            This = &Next->Left;
        else
            return;
    }


    New = ( T )malloc( sizeof( struct T ) );
    if( NULL == New )
        exit( EXIT_FAILURE );
    New->Element = X;
    New->Left = NULL;
    New->Right = NULL;
    *This = New;
    printf( "\n\n" );


    while( NULL != *RootPP ) 
    {

        L_Heigh = Heigh( (*RootPP)->Left );
        R_Heigh = Heigh( (*RootPP)->Right);
        printf( "左子树高度 = %d, 右子树高度 = %d\n", L_Heigh, R_Heigh );

        if( X > (*RootPP)->Element )
        {
            if( 2 <= R_Heigh - L_Heigh )
            {
                if( X > (*RootPP)->Right->Element )
                    fprintf( stderr,"越界点:1\n" ), *RootPP = SingleRotateWithRight( *RootPP );
                else
                    fprintf( stderr,"越界点:2\n" ), *RootPP = DoubleRotateWithRight( *RootPP );
                continue;
            }

            RootPP = &(*RootPP)->Right;
        }
        else if( X < (*RootPP)->Element )
        {

            if( 2 <= L_Heigh - R_Heigh )
            {
                if(  X < (*RootPP)->Left->Element )
                    fprintf( stderr,"越界点:3\n" ), *RootPP = SingleRotateWithLeft( *RootPP );                                
                else
                    fprintf( stderr,"越界点:4\n" ), *RootPP = DoubleRotateWithLeft( *RootPP );
                continue;
            }

            RootPP = &(*RootPP)->Left;
        }
        else
            return;
    }



}    


int
Heigh( T Root )
{
    int u, v;

    if( NULL == Root )
        return -1;

    u = Heigh( Root->Left );
    v = Heigh( Root->Right );

    if( u > v )
        return u + 1;
    else
        return v + 1;
}


T
SingleRotateWithLeft( T Node )
{
    T Temp;

    Temp = Node->Left;
    Node->Left = Temp->Right;
    Temp->Right = Node;

    return Temp;
    
}


T
SingleRotateWithRight( T Node )
{
    T Temp;

    Temp = Node->Right;
    Node->Right = Temp->Left;
    Temp->Left = Node;

    return Temp;
}


T
DoubleRotateWithLeft( T Node )
{
/*    Node->Left = SingleRotateWithRight( Node->Left );
    return SingleRotateWithLeft( Node );
*/
    T K1, K2;

    K1 = Node->Left;
    K2 = K1->Right;

    K1->Right = K2->Left;
    Node->Left = K2->Right;
    K2->Left = K1;
    K2->Right = Node;

    return K2;
}


T
DoubleRotateWithRight( T K1 )
{
/*    Node->Right = SingleRotateWithLeft( Node->Right );
    return SingleRotateWithRight( Node ); 
*/

    T K2, K3;

    K3 = K1->Right;
    K2 = K3->Left;

    K1->Right = K2->Left;
    K3->Left = K2->Right;
    K2->Left = K1;
    K2->Right = K3;

    return K2;

    
}


[此贴子已经被作者于2017-6-12 18:10编辑过]

搜索更多相关主题的帖子: color 
2017-06-12 06:30
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 4楼 九转星河
如果可以你修改一下旋转哪里,然后编译看看。我现在在上班,没办法修改调试。


另外高度问题,跌代版本比预料中的要复杂很多,这就是我一直没想到办法解决的问题。所以不得不求输的绝对高度。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-06-12 07:28
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 6楼 wp231957
W版主如此大礼,小弟怎么承受的起?

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-06-12 10:33
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 7楼 九转星河
我反复看了几次旋转,应该不是那里的问题。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-06-12 10:34
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 10楼 九转星河
在最开始我测试过两种最坏插入,没什么问题。

今天我下班应该很早,回家再弄。


辛苦你这么久,谢啦。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-06-12 12:07
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 13楼 九转星河
标准的AVL 树似乎就是根插,我写这个似乎很非主流。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-06-12 13:12
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 12楼 九转星河
如果存在高度差,那么就不会出现左树或右树为空的情况。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-06-12 13:15
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 16楼 九转星河
看来我的思路出现了问题。

先调整,再插入。

我考虑下先插入,再调整。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-06-12 17:50
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 18楼 九转星河
已经完成了,但是代码好恶心。

真不想承受代码是我自己写的。

至于高度问题,以后再来说吧,也没想到好的办法。



[此贴子已经被作者于2017-6-12 18:08编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-06-12 18:02
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 18楼 九转星河
突然发现,其实我已经完成了删除节点。

只需要稍微修改下插入函数的代码,先删除,然后再调整。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-06-12 18:13
快速回复:AVL树(迭代版本)
数据加载中...
 
   



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

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