各位大神帮忙看看我的AVL树怎么不对啊

飞翔的黄瓜 2017-05-05 11:52:03

#include "stdafx.h"
#include "gg.h"
#include "stdlib.h"
#include "stdio.h"

static AVLTree SingleRotateLeft(AVLTree T)
{
AVLTree T1=T->left;
T->left=T1->right;
T1->right=T;
T->Height=Max(Height(T->left),
Height(T->right))+1;
T1->Height=Max(Height(T1->left),
Height(T1->right))+1;
return T1;
}
static AVLTree SingleRotateRight(AVLTree T)
{
AVLTree T1=T->right;
T->right=T1->left;
T1->left=T;
T->Height=Max(Height(T->left),
Height(T->right))+1;
T1->Height=Max(Height(T1->left),
Height(T1->right))+1;
return T1;
}
static AVLTree DoubleRotataeleft(AVLTree T)
{
T->left=SingleRotateRight(T->left);
return SingleRotateLeft(T);
}
static AVLTree DoubleRotataeright(AVLTree T)
{
T->right=SingleRotateLeft(T->left);
return SingleRotateRight(T);
}
int Height(Position P)
{
if(P==NULL)
return -1;
else
return (P->Height);
}
AVLTree Insert(ElementType x,AVLTree T)
{
if(T== NULL)
{
T=(AVLTree)malloc(sizeof(AVLTree));
if(T==NULL)
printf("out of space");
else
{
T->Date=x;
T->left=T->right=NULL;
T->Height=0;
}
}
else
{
if(x<T->Date)
{
T->left=Insert(x,T->left);
if(Height(T->left)-Height(T->right)==2)
if(x<T->left->Date)
T=SingleRotateLeft(T);
else
T=DoubleRotataeleft(T);
}
else if(x>T->Date)
{
T->right=Insert(x,T->right);
if(Height(T->right)-Height(T->left)==2)
if(x>T->left->Date)
T=SingleRotateRight(T);
else
T=DoubleRotataeright(T);
}

}
T->Height=Max(Height(T->left),Height(T->right))+1;
return T;
}
AVLTree search_Tree(ElementType x,AVLTree T)
{
while(T)
{if(T->Date==x)
return T;
else if(x<T->Date)
search_Tree(x,T->left);
else
search_Tree(x,T->right);
}
return T;
}
void PreOrder(AVLTree T)//qianxubianli
{
if(T!=NULL)
{
printf("%d",T->Date);
PreOrder(T->left);
PreOrder(T->right);
}
}
void MiddleOrder(AVLTree T)
{
if(T!=NULL)
{
MiddleOrder(T->left);
printf("%d",T->Date);
MiddleOrder(T->right);
}
}
void PostOrder(AVLTree T)
{
if(T!=NULL)
{
PostOrder(T->left);
PostOrder(T->right);
printf("%d",T->Date);
}
}
int Max(int a,int b)
{
if(a>b)
return a;
else if(b>a)
return b;
else
return a;
}
int main()
{
AVLTree T=NULL;
AVLTree Q=NULL;
int a[]={12,33,66,45,78,676,434};
for(int i=0;i<7;i++)
Insert(a[i],T);
PreOrder(T);

}
打断点调试Insert是正常的 可以for循环一完 T又为0了,哪出错了呢
...全文
122 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞翔的黄瓜 2017-05-08
  • 打赏
  • 举报
回复
引用 2 楼 FancyMouse 的回复:
AVLTree定义都没有看个蛋。
在楼下贴出来了 麻烦看一下
飞翔的黄瓜 2017-05-08
  • 打赏
  • 举报
回复
引用 1 楼 kernelkoder 的回复:
最好使用csdn自带的代码显示标签,否则没人看这个没有缩进对齐的代码
你好 源代码在楼下对齐贴出了 麻烦看一下
飞翔的黄瓜 2017-05-08
  • 打赏
  • 举报
回复
头文件

#ifndef __ggh
#define __ggh
typedef int ElementType;
typedef struct AVLTreeNode *AVLTree,*Position;
struct AVLTreeNode{
	ElementType Date;
	AVLTree left;
	AVLTree right;
	int Height;
};
static int Height(Position P);
AVLTree Insert(ElementType x,AVLTree T);
int Max(int a,int b);
#endif
源文件

#include "stdafx.h"
#include "gg.h"
#include "stdlib.h"
#include "stdio.h"
 
static AVLTree SingleRotateLeft(AVLTree T)
{
    AVLTree T1=T->left;
    T->left=T1->right;
    T1->right=T;
    T->Height=Max(Height(T->left),
                                  Height(T->right))+1;
    T1->Height=Max(Height(T1->left),
                                  Height(T1->right))+1;
    return T1;
}
static AVLTree SingleRotateRight(AVLTree T)
{
    AVLTree T1=T->right;
    T->right=T1->left;
    T1->left=T;
    T->Height=Max(Height(T->left),
                                  Height(T->right))+1;
    T1->Height=Max(Height(T1->left),
                                  Height(T1->right))+1;
    return T1;
}
static AVLTree DoubleRotataeleft(AVLTree T)
{
    T->left=SingleRotateRight(T->left);
    return SingleRotateLeft(T);
}
static AVLTree DoubleRotataeright(AVLTree T)
{
    T->right=SingleRotateLeft(T->left);
    return SingleRotateRight(T);
}
int Height(Position P)
{
    if(P==NULL)
        return -1;
    else
        return (P->Height);
}
AVLTree Insert(ElementType x,AVLTree T)
{
    if(T==  NULL)
    {
        T=(AVLTree)malloc(sizeof(AVLTree));
            if(T==NULL)
                printf("out of space");
            else
            {
                T->Date=x;
                T->left=T->right=NULL;
                T->Height=0;
            }
    }
    else
    {
        if(x<T->Date)
        {
            T->left=Insert(x,T->left);
            if(Height(T->left)-Height(T->right)==2)
                if(x<T->left->Date)
                    T=SingleRotateLeft(T);
                else
                    T=DoubleRotataeleft(T);
        }
        else if(x>T->Date)
        {
            T->right=Insert(x,T->right);
            if(Height(T->right)-Height(T->left)==2)
                if(x>T->left->Date)
                    T=SingleRotateRight(T);
                else
                    T=DoubleRotataeright(T);
        }
         
    }
    T->Height=Max(Height(T->left),Height(T->right))+1;
    return T;
}
AVLTree search_Tree(ElementType x,AVLTree T)
{
    while(T)
    {if(T->Date==x)
        return T;
    else if(x<T->Date)
        search_Tree(x,T->left);
    else
    search_Tree(x,T->right);
    }
    return T;
}
void PreOrder(AVLTree T)//qianxubianli
{
    if(T!=NULL)
    {
        printf("%d",T->Date);
        PreOrder(T->left);
        PreOrder(T->right);
    }
}
void MiddleOrder(AVLTree T)
{
    if(T!=NULL)
    {
        MiddleOrder(T->left);
        printf("%d",T->Date);
        MiddleOrder(T->right);
    }
}
void PostOrder(AVLTree T)
{
    if(T!=NULL)
    {
        PostOrder(T->left);
        PostOrder(T->right);
        printf("%d",T->Date);
    }
}
int Max(int a,int b)
{
    if(a>b)
        return a;
    else if(b>a)
        return b;
    else
        return a;
}
int main()
{
    AVLTree T=NULL;
    AVLTree Q=NULL;
    int a[]={12,33,66,45,78,676,434};
    for(int i=0;i<7;i++)
        Insert(a[i],T);
    PreOrder(T);
	system("pause");
}
FancyMouse 2017-05-06
  • 打赏
  • 举报
回复
AVLTree定义都没有看个蛋。
kernelkoder 2017-05-06
  • 打赏
  • 举报
回复
最好使用csdn自带的代码显示标签,否则没人看这个没有缩进对齐的代码

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧