我有一个AVL树类,我想找到每个节点的平衡因子(balance_factor: node->Left_child->height - node->right_Child->height
)
这是我的代码
int tree::findBalanceFactor(node p){
int a;
if( p.lchild) p.lchild->balance_factor=findBalanceFactor( *p.lchild );
if( p.rchild) p.rchild->balance_factor=findBalanceFactor( *p.rchild );
if( p.rchild && p.lchild ) a=p.balance_factor = p.lchild->height - p.rchild->height ;
if( p.rchild && !p.lchild ) a=p.balance_factor = 0 - p.rchild->height;
if( !p.rchild && p.lchild ) a=p.balance_factor = p.lchild->height;
if( !p.rchild && !p.lchild ) a=p.balance_factor = 0;
cout << "md" << a << endl;
return a;
但在我打印root->balance_factor
时的主要功能中,它显示我始终为零
balance_factor
是一个公共变量,在构造函数中我为此赋值为零
我的代码出了什么问题?!
提前谢谢你:)
答案 0 :(得分:0)
我猜测由于balance_factor
方法中的这两行代码,根节点的tree::findBalanceFactor
始终为0的原因是:
if( p.lchild) p.lchild->balance_factor=findBalanceFactor( *p.lchild );
if( p.rchild) p.rchild->balance_factor=findBalanceFactor( *p.rchild );
我认为node
struct / class看起来像这样:
struct node {
struct node *lchild;
struct node *rchild;
int balance_factor;
int height;
};
在findBalanceFactor( *p.lchild )
和findBalanceFactor( *p.rchild )
中发生的情况是,我们正在将p.lchild
和p.rchild
的新副本传递到findBalanceFactor
(从指针取消引用看),因此原始balance_factor
和p.lchild
的{{1}}属性不会更新。
解决方案是修改p.rchild
方法以接纳指向节点的指针,就像这样(我已经冒昧地对代码进行了一些美化):
tree::findBalanceFactor
对于int tree::findBalanceFactor(node *p) {
int a;
if (p->lchild) {
findBalanceFactor(p->lchild);
}
if (p->rchild) {
findBalanceFactor(p->rchild);
}
if (p->rchild && p->lchild) {
a = p->balance_factor = p->lchild->height - p->rchild->height;
} else if (p->rchild && !p->lchild) {
a = p->balance_factor = 0 - p->rchild->height;
} else if (!p->rchild && p->lchild) {
a = p->balance_factor = p->lchild->height;
} else {
// this is the case for !p->rchild && !p->lchild
a = p->balance_factor = 0;
}
cout << "md" << a << endl;
return a;
}
和p->lchild
,我们无需再设置p->rchild
次,因为每个balance_factor
的{{1}}已设置为一个非常长的balance_factor
陈述的4种可能情况。
答案 1 :(得分:0)
有一个很多更简单的方法来测试lchild和rchild的每个排列:
int tree::findBalanceFactor(node &n) {
int lheight = 0;
int rheight = 0;
if (n.lchild) {
findBalanceFactor(*n.lchild);
lheight = n.lchild->height;
}
if (n.rchild) {
findBalanceFactor(*n.rchild);
rheight = n.rchild->height;
}
n.balance_factor = lheight - rheight;
std::cout << "md " << n.balance_factor << std::endl;
return n.balance_factor;
}