关于二叉树旋转

Posted

技术标签:

【中文标题】关于二叉树旋转【英文标题】:About binary tree rotations 【发布时间】:2014-03-21 19:24:53 【问题描述】:

我正在尝试在 pascal 上编写 AVL。我已经编写了一个常规的二叉树并且它可以工作,我正在尝试制作一个自平衡的,但我遇到了一个问题。

我有一个要旋转的子树,问题是我不知道如何分配子树根节点指针的父级。给出下一棵树的含义: 我要旋转的子树的根节点 = 30 子树的父节点 = 55

          55                                      55          
       30    60            ----->           45         60         
   10    45    75                        30   50          75       
  5  15    50    90                     10                    90
                                      5    15                

我应该如何将指针从 55 更改为 30,从 55 更改为 45? 我见过的大多数代码都没有从节点到父节点的指针,所以我不知道如何更改它。

【问题讨论】:

【参考方案1】:

您没有显示任何代码,但通常您会按照以下方式做一些事情

Root := Root.Rebalance;

也就是说,您调用子树来重新平衡自身,并且该重新平衡函数返回根作为其结果。该结果可能与以前的根相同,或者 - 在您的场景中 - 一个新的根节点。

【讨论】:

以上是关于关于二叉树旋转的主要内容,如果未能解决你的问题,请参考以下文章

平衡二叉树-双旋转

平衡二叉树-AVL树(LLRRLRRL旋转)

二叉树旋转

平衡二叉树的旋转

以AVL树为例理解二叉树的旋转(Rotate)操作

二叉树学习笔记之树的旋转