当我递归调用插入函数以将节点添加到AVL树时,如何计算特定节点的平衡因子。我还没有开始旋转逻辑。我只想计算平衡因子。
在我目前的尝试中,我被迫存储左侧和右侧的高度。正确的子树,因为没有它们我找不到平衡因子。
typedef struct _avlTree
{
int num;
int balFactor;
int height[2]; // left & right subtree heights
struct _avlTree *left,*right;
} *avlTree;
int avlAdd(avlTree a,avlTree aNew)
{
...
if(a->left == NULL) // left subtree insertion case
{
a->left = aNew;
return(1);
}
else
{
a->height[0] = avlAdd(a->left,aNew);
a->balFactor = a->height[0] - a->height[1];
return( (a->height[0]>a->height[1]) ? (a->height[0]+1) : (a->height[1]+1) );
}
...
}
答案 0 :(得分:1)
平衡因子是节点的右子树和左子树之间的高度差。
创建新节点时,将平衡因子初始化为零,因为它是平衡的(没有子树)。
如果要在右侧插入新节点,请将平衡系数增加1。
如果要在左侧插入新节点,请将平衡因子减少1。
重新平衡(旋转)后,如果在此节点上增加子树的高度,则递归地将高度增加传播到父节点。
答案 1 :(得分:1)
这是一种非常简单的方法。如果存在递归height()
函数,则可以将平衡因子简单地计算为
node->balFactor = height( node->right ) - height( node->left );
这不是最佳方法,因为此方法的复杂性为O( h )
,其中h
是AVL树中node
的高度。为了更好的方法,需要进行更大的讨论:)
网络上的AVL树上有很多资源,少数几个是:
BTW,avlAdd()
函数看起来不对。我没有看到aNew->num
与a->num
的比较。是否转到左子树或右子树必须依赖于此。给定的代码似乎是添加到左子树无条件。