Hello 算法 1.0.0b1 Swift版updateHeight(node: node) updateHeight(node: child) // 返回旋转后子树的根结点 return child } Case 2 ‑ 左旋 类似地,如果将取上述失衡二叉树的“镜像”,那么则需要「左旋」操作。 Figure 7‑27. 左旋操作 同理,若结点 child 本身有左子结点(记为 grandChild ),则需要在「左旋」中添加一步:将 grandChild 作为 作为 node 的右子结点。 7. 树 hello‑algo.com 119 Figure 7‑28. 有 grandChild 的左旋操作 观察发现,「左旋」和「右旋」操作是镜像对称的,两者对应解决的两种失衡情况也是对称的。根据对称性,我 们可以很方便地从「右旋」推导出「左旋」。具体地,只需将「右旋」代码中的把所有的 left 替换为 right 、 所有的 right 替换为 left child 执行「左旋」,再对 node 执行「右旋」。 7. 树 hello‑algo.com 120 Figure 7‑29. 先左旋后右旋 Case 4 ‑ 先右后左 同理,取以上失衡二叉树的镜像,则需要「先右旋后左旋」,即先对 child 执行「右旋」,然后对 node 执行「左 旋」。 Figure 7‑30. 先右旋后左旋 旋转的选择 下图描述的四种失衡情况与上述 Cases 逐个对应,分别需采用0 码力 | 190 页 | 14.71 MB | 1 年前3
Hello 算法 1.0.0b2 Swift版updateHeight(node: node) updateHeight(node: child) // 返回旋转后子树的根结点 return child } Case 2 ‑ 左旋 类似地,如果将取上述失衡二叉树的“镜像”,那么则需要「左旋」操作。 Figure 7‑27. 左旋操作 同理,若结点 child 本身有左子结点(记为 grandChild ),则需要在「左旋」中添加一步:将 grandChild 作为 作为 node 的右子结点。 7. 树 hello‑algo.com 119 Figure 7‑28. 有 grandChild 的左旋操作 观察发现,「左旋」和「右旋」操作是镜像对称的,两者对应解决的两种失衡情况也是对称的。根据对称性,我 们可以很方便地从「右旋」推导出「左旋」。具体地,只需将「右旋」代码中的把所有的 left 替换为 right 、 所有的 right 替换为 left child 执行「左旋」,再对 node 执行「右旋」。 7. 树 hello‑algo.com 120 Figure 7‑29. 先左旋后右旋 Case 4 ‑ 先右后左 同理,取以上失衡二叉树的镜像,则需要「先右旋后左旋」,即先对 child 执行「右旋」,然后对 node 执行「左 旋」。 Figure 7‑30. 先右旋后左旋 旋转的选择 下图描述的四种失衡情况与上述 Cases 逐个对应,分别需采用0 码力 | 199 页 | 15.72 MB | 1 年前3
Hello 算法 1.1.0 Swift版updateHeight(node: node) updateHeight(node: child) // 返回旋转后子树的根节点 return child } 2. 左旋 相应地,如果考虑上述失衡二叉树的“镜像”,则需要执行图 7‑28 所示的“左旋”操作。 第 7 章 树 hello‑algo.com 163 图 7‑28 左旋操作 同理,如图 7‑29 所示,当节点 child 有左子节点(记为 grand_child )时,需要在左旋中添加一步:将 grand_child 作为 node 的右子节点。 图 7‑29 有 grand_child 的左旋操作 可以观察到,右旋和左旋操作在逻辑上是镜像对称的,它们分别解决的两种失衡情况也是对称的。基于对称 性,我们只需将右旋的实现代码中的所有的 left 替换为 right ,将所有的 right 替换为 left ,即可得到左 旋的实现代码: ,仅使用左旋或右旋都无法使子树恢复平衡。此时需要先对 child 执行“左旋”, 再对 node 执行“右旋”。 图 7‑30 先左旋后右旋 4. 先右旋后左旋 如图 7‑31 所示,对于上述失衡二叉树的镜像情况,需要先对 child 执行“右旋”,再对 node 执行“左旋”。 图 7‑31 先右旋后左旋 第 7 章 树 hello‑algo.com 165 5. 旋转的选择 图 7‑32 展0 码力 | 379 页 | 18.47 MB | 1 年前3
Hello 算法 1.2.0 简体中文 Swift 版updateHeight(node: node) updateHeight(node: child) // 返回旋转后子树的根节点 return child } 2. 左旋 相应地,如果考虑上述失衡二叉树的“镜像”,则需要执行图 7‑28 所示的“左旋”操作。 第 7 章 树 www.hello‑algo.com 163 图 7‑28 左旋操作 同理,如图 7‑29 所示,当节点 child 有左子节点(记为 grand_child )时,需要在左旋中添加一步:将 grand_child 作为 node 的右子节点。 图 7‑29 有 grand_child 的左旋操作 可以观察到,右旋和左旋操作在逻辑上是镜像对称的,它们分别解决的两种失衡情况也是对称的。基于对称 性,我们只需将右旋的实现代码中的所有的 left 替换为 right ,将所有的 right 替换为 left ,即可得到左 旋的实现代码: ,仅使用左旋或右旋都无法使子树恢复平衡。此时需要先对 child 执行“左旋”, 再对 node 执行“右旋”。 图 7‑30 先左旋后右旋 4. 先右旋后左旋 如图 7‑31 所示,对于上述失衡二叉树的镜像情况,需要先对 child 执行“右旋”,再对 node 执行“左旋”。 图 7‑31 先右旋后左旋 第 7 章 树 www.hello‑algo.com 165 5. 旋转的选择 图 7‑320 码力 | 379 页 | 18.48 MB | 10 月前3
Hello 算法 1.0.0b5 Swift版updateHeight(node: node) updateHeight(node: child) // 返回旋转后子树的根节点 return child } 2. 左旋 相应的,如果考虑上述失衡二叉树的“镜像”,则需要执行图 7‑28 所示的“左旋”操作。 图 7‑28 左旋操作 同理,如图 7‑29 所示,当节点 child 有左子节点(记为 grandChild )时,需要在左旋中添加一步:将 grandChild 作为 node 的右子节点。 第 7 章 树 hello‑algo.com 160 图 7‑29 有 grandChild 的左旋操作 可以观察到,右旋和左旋操作在逻辑上是镜像对称的,它们分别解决的两种失衡情况也是对称的。基于对称 性,我们只需将右旋的实现代码中的所有的 left 替换为 right ,将所有的 right 替换为 left ,即可得到左 旋的实现代码。 执行“左旋”, 再对 node 执行“右旋”。 第 7 章 树 hello‑algo.com 161 图 7‑30 先左旋后右旋 4. 先右旋后左旋 如图 7‑31 所示,对于上述失衡二叉树的镜像情况,需要先对 child 执行“右旋”,然后对 node 执行“左旋”。 图 7‑31 先右旋后左旋 5. 旋转的选择 图 7‑32 展示的四种失衡情况与上述案例逐个对应,分别需要采用右旋、左旋、先右后左、先左后右的旋转操0 码力 | 376 页 | 30.70 MB | 1 年前3
Hello 算法 1.0.0 Swift版updateHeight(node: node) updateHeight(node: child) // 返回旋转后子树的根节点 return child } 2. 左旋 相应地,如果考虑上述失衡二叉树的“镜像”,则需要执行图 7‑28 所示的“左旋”操作。 第 7 章 树 hello‑algo.com 165 图 7‑28 左旋操作 同理,如图 7‑29 所示,当节点 child 有左子节点(记为 grand_child )时,需要在左旋中添加一步:将 grand_child 作为 node 的右子节点。 图 7‑29 有 grand_child 的左旋操作 可以观察到,右旋和左旋操作在逻辑上是镜像对称的,它们分别解决的两种失衡情况也是对称的。基于对称 性,我们只需将右旋的实现代码中的所有的 left 替换为 right ,将所有的 right 替换为 left ,即可得到左 旋的实现代码: ,仅使用左旋或右旋都无法使子树恢复平衡。此时需要先对 child 执行“左旋”, 再对 node 执行“右旋”。 图 7‑30 先左旋后右旋 4. 先右旋后左旋 如图 7‑31 所示,对于上述失衡二叉树的镜像情况,需要先对 child 执行“右旋”,再对 node 执行“左旋”。 图 7‑31 先右旋后左旋 第 7 章 树 hello‑algo.com 167 5. 旋转的选择 图 7‑32 展0 码力 | 378 页 | 17.59 MB | 1 年前3
共 6 条
- 1













