这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战
结合上一次的分享说到了红黑树,其中红黑树实际上就是一颗特殊的平衡二叉树,今天想分享一下二叉排序树和平衡二叉树
1.二叉排序树
二叉排序树具有如下的性质,如果他的左子树不是空的则左子树上的结点都小于根结点的值;若右子树不为空,则右子树上的所有的结点都大于根结点的值;其左右子树又分别是二叉排序树 其数据结构如下:
typedef struct BiTree {
int data;
BiTree *lchild;
BiTree *rchild;
};
当我们插入数据时,数据都会插入到叶子结点上,我们会和根结节比较,若大于根结点就插入右子树,若小于根结点就插入左子树,依次类推下去找到合适的位置查入
2.平衡二叉树
平衡二叉树有称作AVL树,他具有如下性质:
他的左右子树也是平衡二叉树,并且左右子树的深度之差的绝对值不超过1,那平衡二叉树是如何生成的呢?例如13,24,37,90,53
空树和节点13插入时显然是一棵AVL,插入24后任然是平衡的,
再继续插入37的时候,这时这棵树就不再是平衡二叉树了,因为从(d)可以看出13节点的平衡因子变为2了(左子树和右子树的深度之差已经大于1了,此时需要调整树)将树做一个向左逆时针旋转操作,使24结点为根结点;
当插入90时,此时是平衡的,在插入53时,37这个结点的平衡因子变为2了,则此时需要调整子树,此时调整可能要复杂一些(要保证二叉排序树的特性又要保证平衡)那此时就要以53作为根结点,使37作为其左子树的根,90成为其右子树的根,这个操作就进行了两次旋转,先向右顺时针,后向左逆时针,此时二叉树由不平衡转为平衡