数据结构与算法第五章查找详解.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
非AVL树的平衡化处理 每插入一个新节点时,AVL树中相关节点的平衡状态会发生改变。 因此,在插入一个新节点后,需要从插入位置沿通向根的路径回溯,检查各节点的平衡因子(左、右子树的高度差); 如果在某一节点发现高度不平衡,停止回溯; 从发生不平衡的节点起,沿刚才回溯的路径取直接下两层的节点,做平衡化旋转。 平衡化旋转 平衡化旋转有两类: 单旋转(LL旋转和LR旋转) 双旋转(LR旋转和RL旋转) 如果这三个节点处于一条直线上,则采用单旋转进行平衡化。 如果这三个节点处于一条折线上,则采用双旋转进行平衡化。 LL旋转 RR旋转 LR双旋转 RL双旋转 4 3 2 2 3 4 20 15 18 60 70 65 平衡化旋转 若在 C 的左子树的左子树上插入 结点,使 C 的平衡因子从 1 增加 至 2, 需要进行一次顺时针旋转。 (以 B 为旋转轴) 若在 A 的右子树的右子树上插入 结点,使 A 的平衡因子从 -1 改变 为 -2,需要进行一次逆时针旋转。(以 B 为旋转轴) 2) RR 平衡旋转: 1) LL 平衡旋转: * A C C B C A B A 平衡化旋转 若在 A 的右子树的左子树上插入 结点,使 A 的平衡因子从 -1 改变 为 -2,需要先进行顺时针旋转,再逆时针旋转。(以插入的结点 B 为旋转轴) 4) RL 平衡旋转: 若在 C 的左子树的右子树上插入 结点,使 C 的平衡因子从 1 增加 至 2, 需要先进行逆时针旋转, 再顺时针旋转。(以插入的结点 B 为旋转轴) 3) LR 平衡旋转: B B C A A B C C A B A C B A C C B A 平衡化旋转 LL旋转:新插入节点在不平衡节点的左子树的左子树中; RR旋转:新插入节点在不平衡节点的右子树的右子树中; LR旋转:新插入节点在不平衡节点的左子树的右子树中; RL旋转:新插入节点在不平衡节点的右子树的左子树中。 LL (1)LL旋转:顺时针 h h h + 1 C E A B D 0 0 h h h A C E B D 0 1 在左子树D上插入新节点使其高度增1,导致节点A的平衡因子增到 2,造成了不平衡。 为使树恢复平衡,从A沿插入路径连续取3个节点A、B和D,它们处于一条方向为“/”的直线上,需要做LL旋转。 以节点B为旋转轴,将节点A顺时针旋转成为B的右孩子,B代替原来A的位置,原来B的右孩子E转为A的左孩子。 (a) B A C E D h h + 1 h 1 2 (b) (c) LL旋转的算法 template class T void AVLTreeT::RotateRight ( AVLNodeT *Tree, AVLNodeT * NewTree) { NewTree = Tree→left; Tree→left = NewTree→right; NewTree→right = Tree; } 注:Tree为子树的根节点 NewTree为子树的新的根节点 h h h + 1 C E A B D 0 0 B A C E D h h + 1 h 1 2 (2)RR旋转:逆时针 (a) h h h A C E B D -1 0 h h h + 1 C E A B D 0 0 h h h + 1 B A C E D -2 -1 (b) (c) 在右子树E中插入一个新节点,该子树高度增1导致节点A的平衡因子变成-2,出现不平衡。 沿插入路径检查三个节点A、C和E。它们处于一条方向为“\”的直线上,需要做RR旋转。 以节点C为旋转轴,让节点A反时针旋转成为C的左孩子,C代替原来A的位置,原来C的左孩子D转为A的右孩子。 RR旋转的算法 template class T void AVLTreeT ::RotateLeft ( AVLNodeT *Tree, AVLNodeT * NewTree ) { NewTree = Tree→right; Tree→right = NewTree→left; NewTree→left = Tree; } h h h + 1 C E A B D 0 0 h h h + 1 B A C E D -2 -1 (3)LR旋转:先左后右双旋转 h h h-1 A C E B D 0 h-1 F G 1 h A h h C E B D h-1 F G 2 先逆时针 后顺时针

文档评论(0)

1192212 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档