AVL树和红黑树

92 阅读2分钟

AVL树

平衡二叉树,左右子树高度差不超过1

旋转方式:

  • 左旋:右边高,左边低,将失衡节点左旋,有冲突的左孩变右孩
  • 右旋:左边高,右边低,将失衡节点右旋,有冲突的右孩变左孩

失衡情况:

AVL树失衡情况.jpg

(L代表整数,R代表负数)

  • LL型:插入的节点在失衡节点的左孩子的左子树上,失衡节点右旋
  • RR型:插入的节点在失衡节点的右孩子的右子树上,失衡节点左旋
  • LR型:插入的节点在失衡节点的左孩子的右子树上,先左旋左孩子,然后右旋
  • RL型:插入的节点在失衡节点的右孩子的左子树上,先右旋右孩子,然后左旋

注意:

  • 如果插入节点后,导致多个祖先节点失衡,只需调整距离插入节点最近的失衡节点
  • 如果删除节点后导致失衡,需要依次对每个祖先检查并调整

红黑树

平衡二叉树,左右子树高度近似平衡,高度差不会两倍

红黑树性质:

  • 根叶黑:根是黑色

  • 红生黑:红色节点的左右孩子必须是黑色

  • 根叶同:从任意节点到叶子节点的路径上的黑色节点数量相同

插入的节点默认是红色,按照二叉搜索树的规则插入,如果插入后红黑树性质被破坏就需要调整红黑树,调整规则:

  • 插入节点是根节点:直接变黑
  • 插入节点的叔叔是红色:叔父爷三个节点变色 (红遍黑,黑变红),之后爷爷变插入节点,重新开始判断调整
  • 插入节点的叔叔是黑色:判断是LL,RR,LR,RL中的哪种类型,之后旋转,然后对失衡节点和被旋转的节点变色 (红遍黑,黑变红)

相关链接