[英]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樹上有很多資源,其中一些是:
順便說一句, avlAdd()
函數看起來不對。 我看不到aNew->num
與a->num
相比。 轉到左子樹還是右子樹必須取決於此。 給定的代碼似乎無條件地添加到左子樹中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.