首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

一个关于AVL树的代码.部分地方不懂

2013-03-06 
请教大家一个关于AVL树的代码...部分地方不懂本帖最后由 zfqkjxy 于 2013-02-27 12:47:05 编辑最近看了一

请教大家一个关于AVL树的代码...部分地方不懂
本帖最后由 zfqkjxy 于 2013-02-27 12:47:05 编辑 最近看了一个关于一个AVL树的程序,界面是MFC写的,节点的旁边有标注节点的平衡值。   但是大家请看如下代码,思想很易懂,但是为什么我觉得平衡值不太对啊。详见下:

左旋 //和普通的旋转一样,只不过后面改了平衡值

void RotateLeft(BSTree &tree) {            //左单旋转的算法
BSTNode *temp = tree->rchild;          //RR
tree->rchild = temp->lchild;
temp->lchild = tree;
tree->balance = 0;
temp->balance =0;
tree = temp;
}


右旋//也是如此

void RotateRight(BSTree &tree) {           //右单旋转的算法
BSTNode *temp = tree->lchild;          //LL
tree->lchild = temp->rchild;
temp->rchild = tree;
//tree->balance = 0;
temp->balance =0;
tree = temp;
}


LR与RL旋转先不发了,显得太多,但是问题就在下面的插入上


int Insert(BSTree &tree, int x, int &taller) {                    //AVL树的插入算法
int success = 0;
if(tree==0) {
tree=(BSTree)malloc(sizeof(BSTNode));
tree->data = x;
tree->balance=0;
tree->lchild=NULL;
tree->rchild=NULL;
success = tree!=0?1:0;
if(success) 
taller = 1;
}
else if(x<tree->data) {
success = Insert(tree->lchild, x, taller);
if(taller)
switch(tree->balance) {
case -1:
LeftBalance(tree, taller);
break;
case 0:
tree->balance = -1;
break;
case 1:
tree->balance = 0;
taller = 0;
break;
}
}
else if(x>tree->data) {
success = Insert(tree->rchild, x, taller);
if(taller)
switch(tree->balance) {
case 1:
RightBalance(tree, taller);
break;
case 0:
tree->balance = 1;
break;
case -1:
tree->balance = 0;
taller = 0;
break;
}
}
return success;
}

int Insert(BSTree &tree,int x) {
int taller;
return Insert(tree, x, taller);
}

我怎么感觉上面的case值都反了,大家看一下是不是这样,应该往左边插入的时候父节点加一才对,但是上面的平衡值确实减一,十分奇怪啊,但是最后做出来的界面确实是显示正确的balance值,请问大家怎么回事
[解决办法]
引用:
引用:那你界面对于这个balance是不是取过负了

请问什么意思呢?

"最后做出来的界面确实是显示正确的balance值"
界面是不是重新计算过这个balance值,你确认它是直接显示的node的balance么?

热点排行