数据结构:二叉树、平衡二叉树、红黑树详解

一、 二叉树(binary tree)

指每个节点最多含有两个子树的树结构。时间复杂度为O(log N),在退化成链表的情况下时间复杂度为O(N)。

特点:

1.所有节点最多拥有两个子节点;

2.节点的左子树只包含小于当前根节点的数,节点的右子树只包含大于当前根节点的数。

 

缺点: 只会以我们第一次添加的节点为根节点,如果后面添加的节点值都大于或小于根节点的值,在这种情况下会退化成链表。

 

二、 平衡二叉树(Balanced Binary Tree)

又称为AVL树,具有二叉树的全部特性,解决二叉树退化成链表情况的问题,每个节点的左子树和右子树的高度之差不会超过1,AVL树是严格的 平衡二叉树,追求完全平衡,比较严格。
 
缺点: 由于要求每个节点的左子树和右子树高度之差不超过1,这个要求非常严格,追求完全平衡,这就导致了在频繁插入和删除的场景中, 可能就会导致AVL树失去平衡,AVL树就需要频繁的通过左旋右旋使其重新达到平衡,这时就会时得其性能大打折扣。
 
 

三、红黑树

和AVL树相比,红黑树放弃追求完全平衡,而是追求大致平衡,保证每次插入节点最多只需要三次旋转就能达到平衡,维持平衡的耗时较少,实现起来也更为简单,它的旋转次数较少, 对于频繁插入和删除操作的场景,相比AVL树,红黑树更具优势。
 
特征:
1.红黑树是也是平衡二叉树实现的一种方式
2.节点只能是黑色或者红色,root根节点一定是黑色
3.新增时默认新增的节点是红色,不允许两个红色节点相连
4.红色节点的两个子节点一定是黑色
 

红黑树变换规则

三种规则:

1.改变节点颜色

2.左旋转

3.右旋转

 

变色的情况:

当前节点的父亲节点是红色,并且它的祖父节点的另外一个子节点(叔叔节点)也是红色:以当前节点为指针进行操作

1.将父亲节点变为黑色

2.将叔叔节点变为黑色

3.将祖父节点变为红色

4.再把指针定义到祖父节点进行旋转操作

 

左旋转: 当父亲节点为红色情况,叔叔节点为黑色情况,且当前节点是右子树,左旋转以父节点作为左旋。

 

右旋转: 当父亲节点为红色情况,叔叔节点为黑色情况,且当前节点是左子树,右旋转以父节点作为右旋:

1.将父节点变为黑色

2.将祖父节点变为红色

3.以祖父节点开始旋转

 

 

 

 

posted on 2021-05-11 18:05  Boris丶et  阅读(793)  评论(0编辑  收藏  举报