数据结构:二叉树、平衡二叉树、红黑树详解
一、 二叉树(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.以祖父节点开始旋转