N—E—E 2021-11-04 21:57 采纳率: 59.5%
浏览 41
已结题

为啥这个AVL树输出不正确?

调试后感觉是getheight那里有问题?好像每次进入都给height赋值为-1

#include <stdio.h>
#include <stdlib.h>

struct AVLNode;
typedef struct AVLNode* AVLT;
typedef struct AVLNode* AVLPosition;
typedef int ElementType;

int GetHeight(AVLPosition P);
int Max0(int a, int b);
AVLT LeftRotation(AVLT T);
AVLT RightRotation(AVLT T);
AVLT LeftRightRotation(AVLT T);
AVLT RightLeftRotation(AVLT T);
AVLT AVLInsert(AVLT T, ElementType X);
void PrintAVL(AVLT T);

struct AVLNode {
    ElementType Data;
    int height;
    AVLPosition Left;
    AVLPosition Right;
};

#include "AVL.h"

int GetHeight(AVLPosition P) {
    if (P == NULL)
        return -1;
    else
        return P->height;
}
int Max0(int a, int b) {
    return a > b ? a : b;
}
AVLT LeftRotation(AVLT T) {
    AVLPosition B = T->Left;
    T->Left = B->Right;
    B->Right = T;

    T->height = Max0(GetHeight(T->Left), GetHeight(T->Right) + 1);
    B->height = Max0(GetHeight(B->Left), T->height) + 1;
    return B;
}
AVLT RightRotation(AVLT T) {
    AVLPosition B = T->Right;
    T->Right = B->Left;
    B->Left = T;

    T->height = Max0(GetHeight(T->Left), GetHeight(T->Right)) + 1;
    B->height = Max0(GetHeight(B->Right), T->height) + 1;
    return B;
}
AVLT LeftRightRotation(AVLT T) {
    AVLPosition B = T->Left;
    B = RightRotation(B);
    return LeftRotation(T);
}
AVLT RightLeftRotation(AVLT T) {
    AVLPosition B = T->Right;
    B = LeftRotation(B);
    return RightRotation(T);
}
AVLT AVLInsert(AVLT T, ElementType X) {
    if (!T)
    {
        T = (AVLT)malloc(sizeof(struct AVLNode));
        T->Left = T->Right = NULL;
        T->Data = X;
        T->height = 0;
    }
    else if (X < T->Data)
    {
        T->Left = AVLInsert(T->Left, X);
        if ((T->Left->height - T->Right->height) == 2)
        {
            if (X < T->Left->Data)
                T = LeftRotation(T);
            else
                T = LeftRightRotation(T);
        }
    }
    else if (X > T->Data)
    {
        T->Right = AVLInsert(T->Right, X);
        if (GetHeight(T->Right) - GetHeight(T->Left) == 2)
        {
            if (X > T->Right->Data)
                T = RightRotation(T);
            else
                T = RightLeftRotation(T);
        }
    }
    else    //X = T->Data
        ;
    T->height = Max0(GetHeight(T->Left), GetHeight(T->Right)) + 1;  //从叶子(已由旋转函数进行更新)到根部,必须更新每个节点的height
    return T;
}
void PrintAVL(AVLT T) {
    if (!T)
        return;
    else
    {
        printf("%d\n", T->Data);
        PrintAVL(T->Left);
        PrintAVL(T->Right);
    }
}

#include "AVL.h"

int main() {
    AVLT T = malloc(sizeof(struct AVLNode));
    T->Data = 7;
    T->Left = T->Right = NULL;
    AVLInsert(T, 8);
    AVLInsert(T, 9);
    PrintAVL(T);
    return 0;
}

img

  • 写回答

1条回答 默认 最新

  • _hys 2021-11-05 11:31
    关注

    如果你要叶子结点高度为1的话,就把GetHeight函数return -1;改成 return 0;,否则不用

    
    int GetHeight(AVLPosition P) {
        if (P == NULL)
            return 0;
        else
            return P->height;
    }
    

    主函数修改

    
    int main() {
        AVLT T = NULL;
        T = AVLInsert(T, 7);
        T = AVLInsert(T, 8);
        T = AVLInsert(T, 9);
        PrintAVL(T);
        return 0;
    }
    

    望采纳

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月13日
  • 已采纳回答 11月5日
  • 创建了问题 11月4日

悬赏问题

  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 请求分析基于spring boot+vue的前后端分离的项目
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥200 关于#c++#的问题,请各位专家解答!网站的邀请码
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?