简单的平衡二叉树,可能是指针类问题,卡死在A->Height=Max(GetHeight(A->left),GetHeight(A->right))+1; 

KID6200 2020-01-26 10:36:51
#include<stdio.h> #include<stdlib.h> typedef struct AVLNode* Position; typedef Position AVLTree; struct AVLNode { int data; AVLTree left,right; int Height; };  int Max(int a,int b) { if(a>=b) return a; if(b>a) return b; } AVLTree Find(int x,AVLTree A) { if(x<A->data) A=A->left; else if(x>A->data) A=A->right; else  return A; } int GetHeight(AVLTree A) { int i,j; i=j=0; if(A->left!=NULL) { printf("left"); i=GetHeight(A->left); i++; } if(A->right!=NULL) { j=GetHeight(A->right); j++; printf("right"); } i=Max(i,j); printf("%d",i); return i; } AVLTree insert(int x,AVLTree A) { if(!A) { A=(AVLTree)malloc(sizeof(AVLNode)); A->data=x; A->left=A->right=NULL; } else if(x<A->data) { A->left=insert(x,A->left); if(GetHeight(A->left)-GetHeight(A->right)==2) { if(x<A->left->data) A=SingleleftRotation(A); else if(x>A->left->data) A=DoubleleftrightRotation(A); } } else if(x>A->data) { A->right=insert(x,A->right); if(GetHeight(A->left)-GetHeight(A->right)==-2) { if(x<A->left->data) A=SingleleftRotation(A); else if(x>A->right->data) A=DoublerightleftRotation(A); } } A->Height=Max(GetHeight(A->left),GetHeight(A->right))+1;  return A; } int main() { AVLTree A=NULL,B=NULL; int x,y; printf("please input a number"); scanf("%d",&x); while(x!=0) { A=insert(x,A); printf("please input a number"); scanf("%d",&x); } scanf("%d",&x); while(x!=0) { B=A; A=Find(x,A); y=GetHeight(A); printf("树的高度为%d\n",y); scanf("%d",&x); A=B; } }
...全文
160 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
KID6200 2020-02-02
  • 打赏
  • 举报
回复
引用 7 楼 寻开心的回复:
int Max(int a, int b) { return a>=b ? a : b; };
这个写不写没有多大意义,c++自己就有一个max()函数,何必多此一举

int GetHeight(AVLTree A)
{
if ( NULL == A ) return 0; // 补充这一行代码就可以解决这个函数的问题
....
抱歉,大神,最近这几天都在玩,忘记回了。我是信息与计算科学专业,现在大一还没学计算机语言,在自学,很多都不如专业学过的,请见谅
寻开心 2020-01-29
  • 打赏
  • 举报
回复
int Max(int a, int b) { return a>=b ? a : b; };
这个写不写没有多大意义,c++自己就有一个max()函数,何必多此一举

int GetHeight(AVLTree A)
{
if ( NULL == A ) return 0; // 补充这一行代码就可以解决这个函数的问题
....
KID6200 2020-01-28
  • 打赏
  • 举报
回复
引用 5 楼 寻开心的回复:
代码能走通吗? 比较怀疑!!

AVTree Find(int x, AVTree A) 这个函数看起来也是有问题的
看做法貌似递归查找, 可是还不完全, 代码还是半成品吧
走不通,的确是半成品(捂脸)
寻开心 2020-01-28
  • 打赏
  • 举报
回复
代码能走通吗? 比较怀疑!!

AVTree Find(int x, AVTree A) 这个函数看起来也是有问题的
看做法貌似递归查找, 可是还不完全, 代码还是半成品吧
寻开心 2020-01-28
  • 打赏
  • 举报
回复
GetHeight()这个函数传递进来的参数A是NULL的时候就出问题了
A->left这个时候是非法的

主函数
intsert(x,A)// 这里A是NULL

进入insert函数
if (!A ) {
//
} else ../
A->height = Max( GetHeight(A->Left), GetHegiht(A->right))+1; // 这里GetHegith传递进去的参数都是NULL

回到GetHeight函数里面, 这个函数一进来就要先判断A是否为NULL
如果是NULL return 0; 就好了
GKatHere 2020-01-27
  • 打赏
  • 举报
回复
引用 2 楼 KID6200 的回复:
为什么不要b>a,下面那个旋转代码我检查一下
肯定b>a,所以浪费
KID6200 2020-01-27
  • 打赏
  • 举报
回复
为什么不要b>a,下面那个旋转代码我检查一下
GKatHere 2020-01-26
  • 打赏
  • 举报
回复

int Max(int a,int b)
{
if(a>=b)
return a;
//if(b>a)  不要
return b;
}

while(x!=0)
{
A=insert(x,A);   // 卡死在此处?  SingleleftRotation  DoublerightleftRotation有没问题?
printf("please input a number");
scanf("%d",&x);
}

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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