面试题答案
一键面试- 关键步骤:
- 普通二叉搜索树插入:
- 按照二叉搜索树的插入规则,找到插入位置并插入新节点。从根节点开始,比较新节点的值与当前节点的值,如果新节点值小于当前节点值,就向左子树移动;否则向右子树移动,直到找到合适的叶子节点位置插入新节点。
- 颜色设置:
- 新插入的节点设置为红色。因为这样不会改变从根到叶子节点路径上的黑色节点数量,对红黑树性质影响较小。
- 调整操作:
- 情况1:新节点是根节点:将新节点颜色设为黑色,因为根节点必须是黑色,这样就满足了红黑树性质。
- 情况2:新节点的父节点是黑色:无需调整,因为新插入红色节点不影响红黑树性质。
- 情况3:新节点的父节点是红色:此时红黑树性质被破坏,需要通过旋转和颜色调整来恢复。设新节点为
z
,父节点为p
,祖父节点为g
,叔叔节点为u
。- 情况3.1:叔叔节点
u
是红色:将父节点p
和叔叔节点u
设为黑色,祖父节点g
设为红色。然后把g
当作新的当前节点,继续向上检查,重复情况判断和调整。 - 情况3.2:叔叔节点
u
是黑色且z
是右孩子,p
是左孩子:对p
进行左旋,此时z
成为父节点,p
成为左孩子。然后进入情况3.3。 - 情况3.3:叔叔节点
u
是黑色且z
是左孩子,p
是左孩子:对祖父节点g
进行右旋,然后交换p
和g
的颜色。这样就恢复了红黑树性质。
- 情况3.1:叔叔节点
- 普通二叉搜索树插入:
- 保持红黑树性质的代码实现思路:
- 在插入新节点后:
- 通过一个循环来处理情况3,在循环中判断当前节点(初始为新插入节点)及其父节点、叔叔节点等的颜色和位置关系。
- 利用已有的左旋、右旋函数来进行树结构调整。例如在情况3.2和3.3中,通过左旋和右旋操作来改变树的形态。
- 在调整颜色时,直接修改节点的颜色属性。如在情况3.1中,修改父节点、叔叔节点和祖父节点的颜色。
- 结束条件:
- 当当前节点是根节点或者当前节点的父节点是黑色时,结束循环,此时红黑树性质得到恢复。
- 在插入新节点后: