数据结构(一)树型结构

只总结一些知识点,不包含代码和画图,相关画图推荐相关文章链接。

满二叉树

定义: 一棵深度为k,且有2^k-1个节点的树即为满二叉树。即叶子节点都在同一层,除了叶子节点外的所有节点都有两个子节点。

第n层的节点数:2^(n-1)

总节点数:2^k -1

树的高度: log2 (总节点数+1)

 

完全二叉树

与满二叉树定义类似,不同是最后一层的节点不一定是满的,而除了最后一层的其他层节点数都是满的。

满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树

 

二叉搜索树(BST)

  • 左子树上所有结点的值均小于或等于它的根结点的值。
  • 右子树上所有结点的值均大于或等于它的根结点的值。
  • 左、右子树也分别为二叉查找树。
  • 存在极端情况节点全部位于一条分支上,变成线性查找(比如进入树的顺序是1、2、3、4,会变成一个单一右子树链表)。
  • 查找和插入时间复杂度最好的情况O(Log2n),最差是O(n)
  • 查找过程即比较当前值小于当前节点,就查找左子树,大于当前节点就插右子树,递归查找。平衡二叉树和红黑树也是同理,只是在插入的时候会判断是否符合树的规则,进行树的调整。

 

平衡二叉树

  • 基于二叉搜索树,实现自平衡。避免出现像二叉搜索树极端情况变成链表的情况。
  • 任意节点的两个子树的高度差的绝对值不超过1,也被称为高度平衡树
  • 平衡因子:节点的左子树和右子树的高度差,在平衡二叉树中只有三个取值,1代表左子树比右子树高,0表示一样高,-1表示右子树比左子树高。
  • 最小失衡子树:在新插入的结点向上查找,以第一个平衡因子的绝对值超过 1 的结点为根的子树称为最小不平衡子树。新插入一个节点可能导致多个节点失衡,但是只要调整最小失衡树就能将失衡的树调整为平衡的树。
  • 调整的方式分为左旋和右旋。平衡二叉树插入节点4种情况,调整的方式也不同。
  1. LL,基于最小失衡树根节点的左孩子的左子树插入,左边高,右旋。
  2. RR,基于最小失衡树根节点的右孩子的右子树插入,右边高,左旋。
  3. LR,基于最小失衡树根节点的左孩子的右子树插入,先左旋再右旋。
  4. RL,基于最小失衡树根节点的右孩子的左子树插入,先右旋再左旋。
  • 左旋流程如下
  1. 节点的右孩子替代此节点位置
  2. 右孩子的左子树变为该节点的右子树
  3. 节点本身变为右孩子的左子树
  • 右旋流程如下
  1. 节点的左孩子代表此节点
  2. 节点的左孩子的右子树变为节点的左子树
  3. 将此节点作为左孩子节点的右子树。
  • 插入和查询的时间复杂度都是O(logn)。
  • 平衡二叉树可以是空树。

详细图解参考这篇文章https://mp.weixin.qq.com/s/zav3hOoj6eszlOM7YfgYeA

 

红黑树

基于二叉搜索树,通过节点变色和左旋右x

红黑树的特性

  1. 节点是红色或黑色。
  2. 根节点是黑色。
  3. 每个叶子节点都是黑色的空节点(NIL节点)。
  4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
  5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
  • 根据红黑树的特性左右子树的高度差不会超过2倍,比如左子树是4个黑色节点,右子树是黑红相间就是8个(需要跟左子树保持相同数目的黑色节点)。

红黑树插入

调整二叉树的平衡,有两种操作,一种是变色,一种是左旋和右旋。插入数据按照红色节点插入,因为如果插入的节点位置的父节点是黑色的,插入后不影响红黑树结构,如果父节点是红色才需要调整。如果直接插入黑色节点,那么直接就破坏红黑树的结构了。以下如果根据几个场景总结。

  1. 红黑树是空树。直接插入节点,节点颜色设置黑色,因为根节点要设置成黑色。
  2. 插入的节点key值已经存在,因为本身就是符合条件的红黑树,只要把当前要插入的节点颜色设置成已存在的节点颜色,替换节点即可。
  3. 插入节点的父节点为黑色,设置当前节点为红色,直接插入即可。
  4. 插入节点的父节点为红色(父节点为红色,祖父节点肯定是存在且为黑色,红黑树不可以是红红,且根节点是黑色),有几种情况。

以下为插入节点的父节点为红色的情况。假设父亲节点的兄弟节点为叔叔节点。

  1. 叔叔节点存在,且也为红色的情况。把父节点和叔叔节点设置成黑色,祖父设置成红色。如果祖父节点不是根节点,那么如果祖父的父节点也是红色,继续往上变色调整,如果变到根节点而根节点必须为黑色,则通过左旋右旋调整,和平衡二叉树的LL,LR,RR,RL调整方式一致。如果祖父节点是根节点,那么祖父节点要设置成黑色,此时会变成祖父、父、叔叔节点都变成黑色(黑色节点数增加,这是唯一会增加黑色节点的场景)。
  2. 叔叔节点不存在为叶子节点(叔叔不是红色节点肯定是叶子空节点,不然父节点是红色节点,叔叔节点为黑色,两边树高度不一致,就不满足红黑树)。此时和平衡二叉树一致,如果父节点是祖父节点的左孩子,当前插入的是父节点的左边,即LL,则右旋。如果是LR则左旋再右旋,如果是RR则左旋,如果是RL则右旋再左旋。

红黑树删除

  • 删除即先查到对应的节点,删除节点分三种情况。
  1. 如果要删除的节点没有子节点直接删除。
  2. 如果有一个子节点,删除后该子节点替换该节点。
  3. 如果有两个节点,则用大于当前节点的最小节点替代(比如右孩子如果只有一个节点,就是右孩子,如果右孩子有个左子节点,就是右孩子的左子节点),也称为后继结点。也可以用前继节点,即小于当前节点的最大节点。
  • 待删除结点被替代节点替代后(即两个节点交换位置,直接删掉待删除节点),在不考虑结点的键值的情况下,对于树来说,可以认为删除的是替代结点(因为现在待删除节点的位置是在替换节点原来的位置)。所以删除节点,要考虑替换节点位置被删除后,怎么维持树的平衡。
  1. 替换结点是红色结点,由于红色节点删除后不会影响树的平衡,只要把替换结点的颜色设为删除的结点的颜色,与删除节点交换位置,将待删除节点删除即可。
  2. 替换节点是黑色节点有多种情况。(1)替换节点是其父节点的左子节点。(1.1)兄弟节点是红色(此时可以得知父亲节点是黑色,子节点也是黑色)。先把兄弟节点变黑色,父亲节点变红色,再左旋或右旋。(1.2)替换节点的兄弟节点是黑色(无法确定父节点和子节点的颜色)。情况太多参考下面提供的链接。简单总结就基于替换节点的兄弟节点进行LL RR RL LR(第二个字母表示红色子节点的位置)的处理方式,再变色。如果兄弟节点的子节点没有红色,则把兄弟节点变红,更改替换节点为父节点,自底向上处理,如果到父节点是根节点的情况还是没有,把兄弟节点变红就结束了。删除一个黑色替换节点的核心就是借一个红色节点来变色替换,为什么借红色?因为红色借过来不会影响红黑树的平衡,兄弟节点没得借就把兄弟节点变红,让父亲节点成为替换节点,父亲节点去跟叔叔节点借。

红黑树时间复杂度

  • 红黑树查找和插入平均时间复杂度O(logN),最差是O(2logN)。

为什么有了平衡二叉树还要有红黑树?

  • 因为平衡二叉树要求的是高度平衡,每次插入数据可能都需要调整树结构维持树的高度平衡,如果插入和删除比较频繁的话,会导致树频繁调整使得性能降低。红黑树是一种不严格的平衡树,保持一定的平衡性,树的调整会比平衡二叉树少,但是查询平衡二叉树性能会高一点。如果插入删除比较频繁就用红黑树,查询比较频繁就用平衡二叉树。

详细图解可以参考这篇文章  https://www.jianshu.com/p/e136ec79235c

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值