day062:平衡二叉树——左旋、右旋

本文详细解析了平衡二叉树的左旋和右旋操作,包括其原因、定义、图解示例,以及如何根据节点高度进行调整。深入理解如何避免树的不平衡,提高查找效率。

二叉树、平衡二叉树的介绍:day061:二叉树、二叉查找树、平衡二叉树_ZQyyds:)的博客-CSDN博客

目录

一、平衡二叉树的左旋

1.为什么要左旋、右旋?

2.什么是左旋?

3.图解

 二、平衡二叉树的右旋

1.什么是右旋?

2.图解

 三、总结

1.往哪旋:

2.关于多余的节点(子树上的节点)


一、平衡二叉树的左旋

1.为什么要左旋、右旋?

防止二叉树出现“长短腿”的情况;便于二叉树查找

2.什么是左旋?

左旋:指将根节点的右侧往左拉,原先的右子节点变成新的父节点,并把多余的左子节点出让,给已经降级的根节点当右子节点

3.图解

(1)原先的根节点为7,右子节点10 有个左子节点9

(2)暂且不看10的左子节点,先将二叉树左旋

 (3)左旋后如下图

(4)左旋后,将原来10的左子节点9,给已经降级的原根节点 7 做右子节点即可

 二、平衡二叉树的右旋

1.什么是右旋?

右旋:指将根节点的左侧往右拉,原先的左子节点变成新的父节点,并把多余的右子节点出让,给已经降级的根节点当左子节点

2.图解

(1)原先的根节点为7,左子节点4有个右子节点5

(2)暂且不看右子节点5,先将二叉树右旋,新的父节点为4

(3)再将原右子节点5,作为已降级的7的左子节点即可

 三、总结

1.往哪旋:

大致:

左子树高:右旋;右子树高:左旋;

平衡二叉树有左左、右右、左右、右左四种旋转情况,具体怎么旋视情况而定

2.关于多余的节点(子树上的节点)

左旋后当已降级的右节点;右旋后当已降级的左节点 

题目描述 题目背景:小L和小H在玩一个rpg游戏,不幸的是,小H在魔法森林里迷路了,小L要赶紧把小H救出来! 魔法森林的地图是一棵二叉树,小H现在在某个叶子节点处,而小L在根节点,要找到小H,小L需要把整棵树遍历一次,但是魔法森林里危机重重,小L必须发动魔法来减少危险程度 题目描述: 小L的魔法可以改变魔法森林的地图,具体而言,小L可以把以这棵二叉树中某个节点为根的子树转接到二叉树中某个叶子节点的下方,但只能发动一次 小L想请你告诉他,发动魔法之后,最多可以把二叉树的深度减小到多少 小L是很聪明的,如果任何一种转接子树的方法均不能减小深度,那么小L就不会发动魔法 注意,如果去掉了当前子树后,原二叉树没有其他的叶子节点,则不允许移动该子树 子树定义为原二叉树中某节点及其所有后代保持原有亲子关系的一棵树 二叉树的深度定义为所有叶子节点的深度最大值,根节点的深度为1 Hint:若删除子树ls[i],剩余部分的最深叶子节点可以分两个部分求取:子树rs[i]中的叶子和删掉子树i后剩余部分的叶子,如果从根节点往下求这个值,则后面这一项是可以递推的。rs同理,若没有rs,会出现什么额外情况? 输入格式 第一行的输入 n n 表示二叉树的节点个数 接下来 n n 行,每行输入 2 2 个数,第 i i 行的数分别表示节点 i i 的左右儿子,若没有左/右儿子,则对应的数为0 输出格式 输出一个数字,表示发动魔法后,新的二叉树可以达到的最小深度 如果任何转接方式均不能减小深度,输出原二叉树的深度 保证节点1为根节点,数据范围 对于100%的测试点: 1 ≤ n ≤ 1 0 6 1≤n≤10 6 时空磁盘限制(运行时) 时间限制:1000 ms 内存空间限制:244 MiB 磁盘空间限制:244 MiB 文件数量限制:无限制 单个测试点时空限制详情 完成任务,使用C++
04-25
### 平衡二叉树左旋右旋操作练习题目录 #### 一、基础概念理解 1. **平衡因子计算** - 计算给定二叉树各节点的平衡因子并判断哪些节点处于不平衡状态[^4]。 2. **识别最小不平衡子树** - 鉴于一系列插入或删除后的二叉搜索树,找出首个具有绝对值超过1的平衡因子的节点作为最小不平衡子树的根节点[^5]。 #### 二、基本旋转技巧掌握 3. **简单右旋案例分析** - 对于一棵简单的非平衡二叉树,在特定条件下执行一次标准的右旋操作,并解释每一步骤的作用及其如何影响整体结构[^2]。 4. **简单左旋案例分析** - 类似上述右旋练习,但针对需要进行左旋调整的情形,展示具体过程以及最终达到的效果。 #### 三、组合旋转应用实践 5. **先左后右双旋转实例解析** - 当遇到既不适合单独做左旋也不适合直接采用右旋来恢复平衡的情况时,学习通过先实施左旋再接续以右旋的方式解决问题的方法。 6. **先右后左双旋转实例解析** - 探讨另一种情况下的双重旋转策略——即首先尝试右旋随后紧接着施行左旋动作,确保能够有效应对更复杂的失衡状况。 7. **多步连续旋转综合训练** - 设计一个多阶段的任务场景,其中涉及多次不同类型的旋转(包括但不限于单次/复合形式),以此测试对于多种旋转技术灵活运用的能力。 8. **特殊情况处理挑战** - 提供一些特殊布局的初始数据集,这些数据可能导致常规方法难以奏效;鼓励探索创新解决方案的同时巩固对各种旋转机制的理解程度。 9. **性能优化思考题** - 考虑到实际应用场景中的效率问题,讨论在保持AVL特性不变的前提下,能否减少不必要的旋转次数从而提高算法的整体表现? ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right self.height = 1 def get_balance_factor(node): if not node: return 0 return height(node.left) - height(node.right) def rotate_right(y): x = y.left T2 = x.right # Perform rotation x.right = y y.left = T2 # Update heights y.height = max(height(y.left), height(y.right)) + 1 x.height = max(height(x.left), height(x.right)) + 1 # Return new root of subtree return x def rotate_left(x): y = x.right T2 = y.left # Perform rotation y.left = x x.right = T2 # Update heights x.height = max(height(x.left), height(x.right)) + 1 y.height = max(height(y.left), height(y.right)) + 1 # Return new root of subtree return y def height(node): if not node: return 0 return node.height ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZQyyds:)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值