AVL树插入

时间:2010-10-12 18:35:50

标签: c avl-tree

当我递归调用插入函数以将节点添加到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) );
  }
                ...
}

2 个答案:

答案 0 :(得分:1)

平衡因子是节点的右子树和左子树之间的高度差。

创建新节点时,将平衡因子初始化为零,因为它是平衡的(没有子树)。

如果要在右侧插入新节点,请将平衡系数增加1。

如果要在左侧插入新节点,请将平衡因子减少1。

重新平衡(旋转)后,如果在此节点上增加子树的高度,则递归地将高度增加传播到父节点。

答案 1 :(得分:1)

这是一种非常简单的方法。如果存在递归height()函数,则可以将平衡因子简单地计算为

node->balFactor = height( node->right ) - height( node->left );

这不是最佳方法,因为此方法的复杂性为O( h ),其中h是AVL树中node的高度。为了更好的方法,需要进行更大的讨论:)

网络上的AVL树上有很多资源,少数几个是:

  1. http://en.wikipedia.org/wiki/AVL_tree
  2. C实施:http://www.stanford.edu/~blp/avl/libavl.html
  3. 动画:http://www.cs.jhu.edu/~goodrich/dsa/trees/avltree.html
  4. 动画:http://www.strille.net/works/media_technology_projects/avl-tree_2001/
  5. BTW,avlAdd()函数看起来不对。我没有看到aNew->numa->num的比较。是否转到左子树或右子树必须依赖于此。给定的代码似乎是添加到左子树无条件