簡體   English   中英

AVL樹插入

[英]AVL Tree insertion

當我遞歸調用用於將節點添加到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) );
  }
                ...
}

平衡因子是節點左右子樹之間的高度差。

創建新節點時,將平衡因子初始化為零,因為它是平衡的(沒有子樹)。

如果要在右側插入新節點,請將平衡因子增加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/

順便說一句, avlAdd()函數看起來不對。 我看不到aNew->numa->num相比。 轉到左子樹還是右子樹必須取決於此。 給定的代碼似乎無條件地添加到左子樹中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM