AVL树平衡因子

时间:2014-01-10 14:50:36

标签: c++ recursion tree avl-tree

我有一个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是一个公共变量,在构造函数中我为此赋值为零 我的代码出了什么问题?!

提前谢谢你:)

2 个答案:

答案 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.lchildp.rchild新副本传递到findBalanceFactor (从指针取消引用看),因此原始balance_factorp.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;
}