AVL 树插入和删除

问题描述

我想知道我是否在 AVL 树上正确应用了以下插入和删除操作:

                           62
                          /  \
                        44    78
                       /  \     \
                     17    50    88
                          /  \
                        48    54

对于这个问题,删除会用它的后继替换已删除的项目。

这就是我认为应该通过这些操作修改树的方式:

插入(42)和插入(90)

                           62
                          /  \
                        44    78
                       /  \     \
                     17    50    88
                       \   /  \    \
                       42 48  54    90

       

删除(62)

                           78
                          /  \
                        44    88
                       /  \     \
                     17    50    90
                       \   /  \    
                       42 48  54    

插入(92)

                           78
                          /  \
                        44    88
                       /  \     \
                     17    50    90
                       \   /  \    \  
                       42 48  54    92

删除(50)

                           78
                          /  \
                        44    88
                       /  \     \
                     17    54    90
                       \   /       \  
                       42 48        92

解决方法

有两种情况需要旋转:

                         ___62___
                        /        \
                     __44__      78
                    /      \       \
                   17      50      88
                          /  \
                         48  54

您正确地应用了 insert(42),但是 insert(90) 创建了一个不平衡的子树,其根为 78(用星号标记):它的右侧高度为 2,而其左侧为空:>

                         ___62___
                        /        \
                     __44__      78*
                    /      \       \
                   17      50      88
                     \    /  \       \
                     42  48  54       90

所以,这不会一直这样:简单的向左旋转将向上移动 88 度,向下移动 78 度:

                         ___62___
                        /        \
                     __44__      88
                    /      \    /  \
                   17      50  78  90
                     \    /  \    
                     42  48  54    

您对 delete(62) 的理解是正确的:这会将根与其后继者交换,即 78,然后删除 62:

                         ___78___
                        /        \
                     __44__      88
                    /      \       \
                   17      50      90
                     \    /  \    
                     42  48  54   

insert(92) 将在节点 88 处带来不平衡:

                         ___78___
                        /        \
                     __44__      88*
                    /      \       \
                   17      50      90
                     \    /  \       \
                     42  48  54      92

因此再次应用简单的向左旋转:

                         ___78___
                        /        \
                     __44__      90
                    /      \    /  \
                   17      50  88  92
                     \    /  \       
                     42  48  54      

delete(50) 已正确执行。鉴于上述状态,我们得到:

                         ___78___
                        /        \
                     __44__      90
                    /      \    /  \
                   17      54  88  92
                     \    /         
                     42  48