2013-09-30 57 views
0

我已經看到,當一個節點從AVL樹中刪除時,它可能需要重建多次,而插入只需要一次。任何人都可以給我一個這種刪除案例的例子。 另外我已經實現了AVL樹,我想檢查delete()函數是否正常工作。所以你可以給一系列的插入,然後刪除,這可以幫助我確定我的delete()是否正確,並處理所有這些?AVL樹的刪除和重構

假設你有一個AVL樹,每個節點存儲一個名稱(字符串),並且你有函數insertAVL(element)和deleteAVL(element)。

回答

0

好吧,插入和刪除都可以有多個旋轉,因爲你必須在樹上工作。

例如,添加{5,2,4,3,7,8,10,9}的數據集,然後刪除{5},添加{9},最後刪除{2}。你得到以下。

addValue. id=5 
└── (1) 5 

addValue. id=2 
└── (2) 5 
    └── (1) 2 

addValue. id=4 
└── (3) 5 *unbalanced left 2 - right 0* 
    └── (2) 2 
     └── (1) 4 
After left rotation: 
└── (3) 5 *unbalanced left 2 - right 0* 
    └── (2) 4 
     └── (1) 2 
After right rotation: 
└── (2) 4 
    ├── (1) 2 
    └── (1) 5 

addValue. id=3 
└── (3) 4 
    ├── (2) 2 
    │ └── (1) 3 
    └── (1) 5 

addValue. id=7 
└── (3) 4 
    ├── (2) 2 
    │ └── (1) 3 
    └── (2) 5 
     └── (1) 7 

addValue. id=8 
└── (3) 4 
    ├── (2) 2 
    │ └── (1) 3 
    └── (3) 5 *unbalanced right 2 - left 0* 
     └── (2) 7 
      └── (1) 8 
After left rotation: 
└── (3) 4 
    ├── (2) 2 
    │ └── (1) 3 
    └── (2) 7 
     ├── (1) 5 
     └── (1) 8 

addValue. id=10 
└── (4) 4 
    ├── (2) 2 
    │ └── (1) 3 
    └── (3) 7 
     ├── (1) 5 
     └── (2) 8 
      └── (1) 10 

addValue. id=9 
└── (4) 4 
    ├── (2) 2 
    │ └── (1) 3 
    └── (3) 7 
     ├── (1) 5 
     └── (3) 8 *unbalanced left 0 - right 2* 
      └── (2) 10 
       └── (1) 9 
After right rotation: 
└── (5) 4 
    ├── (2) 2 
    │ └── (1) 3 
    └── (4) 7 
     ├── (1) 5 
     └── (3) 8 *unbalanced right 2 - left 0* 
      └── (2) 9 
       └── (1) 10 
After left rotation: 
└── (4) 4 
    ├── (2) 2 
    │ └── (1) 3 
    └── (3) 7 
     ├── (1) 5 
     └── (2) 9 
      ├── (1) 8 
      └── (1) 10 

removeValue. value=5 
└── (4) 4 
    ├── (2) 2 
    │ └── (1) 3 
    └── (3) 7 *unbalanced right 2 - left 0* 
     └── (2) 9 
      ├── (1) 8 
      └── (1) 10 
After left rotation: 
└── (4) 4 
    ├── (2) 2 
    │ └── (1) 3 
    └── (3) 9 
     ├── (2) 7 
     │ └── (1) 8 
     └── (1) 10 

addValue. id=9 
└── (5) 4 
    ├── (2) 2 
    │ └── (1) 3 
    └── (4) 9 
     ├── (3) 7 *unbalanced right 2 - left 0* 
     │ └── (2) 8 
     │  └── (1) 9 
     └── (1) 10 
After left: 
└── (4) 4 
    ├── (2) 2 
    │ └── (1) 3 
    └── (3) 9 
     ├── (2) 8 
     │ ├── (1) 7 
     │ └── (1) 9 
     └── (1) 10 

removeValue. value=2 
└── (4) 4 *unbalanced right 3 - left 1* 
    ├── (1) 3 
    └── (3) 9 
     ├── (2) 8 
     │ ├── (1) 7 
     │ └── (1) 9 
     └── (1) 10 
After right rotation: 
└── (4) 4 *unbalanced right 3 - left 1* 
    ├── (1) 3 
    └── (3) 8 
     ├── (1) 7 
     └── (2) 9 
      ├── (1) 9 
      └── (1) 10 
After left rotation: 
└── (3) 8 
    ├── (2) 4 
    │ ├── (1) 3 
    │ └── (1) 7 
    └── (2) 9 
     ├── (1) 9 
     └── (1) 10 

我有一棵AVL樹​​,如果你想仔細看看。

+0

我說多次重組不是輪換;通過重組,我的意思是在一個位置完成一組左右旋轉 – zed111

+0

@ zed111在旋轉旁邊的AVL樹中沒有重構。在上面的示例中,雙(左/右)旋轉在相同的位置完成。 – Justin

+0

我從來沒有說除了輪轉之外還有任何重組,我只是說我的意思是1重組= 1左旋+ 1右旋在一個位置。插入和刪除之間的區別在於,在插入時,在最多一次重組之後確保樹平衡,而在刪除時,您可能必須在多個位置進行重組,因此不止一次重組 – zed111