搜索二叉树
它左子树上所有结点的值均小于它的根结点的值,右子树上所有结点的值均大于它的根结点的值
插入时判断根节点,如果小于就插入左子节点,大于插入右子节点,相等不管(搜索二叉树默认没有重复值)
删除时:
1.删除的节点是叶子节点:直接删除
2.删除的节点仅有右子节点:删除后将父节点指向右子节点
3.删除的节点仅有左子节点:删除后将父节点指向左子节点
4.删除的节点有两个子节点:找到右子树的最近最左节点代替
二叉平衡(AVL)树
本质是平衡的(封装了左旋和右旋)的搜索二叉树
左旋:设定节点pivot与它的右节点换位并继承其左节点
右旋同理
因为AVL数的左右子树高度相差不超过1,故经常要用到左右旋
四种不平衡情况:
LL型:根节点左孩子的左孩子还有非空节点,根节点的左子树比右子树高2;根节点一次左旋
RR型:根节点右孩子的右孩子还有非空节点,根节点的右子树比左子树高2;根节点一次右旋
LR型:根节点左孩子的右孩子还有非空节点,根节点的左子树比右子树高2;左孩子一次右旋,根节点一次左旋
RL型:根节点右孩子的左孩子还有非空节点,根节点的右子树比左子树高2;右孩子一次左旋,根节点一次右旋
1.当删除节点时如果是叶子节点,要先判断删除后是否平衡(先向上遍历高度,再判断)
2.如果删除节点有替代(二叉搜索树中删除的情况2、3),同1,不用管其下子树
3..如果删除节点有替代(二叉搜索树中删除的情况4),右子树的每一个节点都要判断是否平衡
Size Balanced树
SB树是一种平衡二叉搜索树,它和红黑树一样是属于阉割性的AVL树,不需要苛求左右子树相差不到1,比较实用
它只要求每棵子树不小于其兄弟的子树大小即可
它也有四种不平衡情况:
1.某某节点的左子树大于兄弟节点的树(LL:4>3): 根节点一次右旋,谁的子树发生平衡就递归执行谁
2.某某节点的右子树大于兄弟节点的树(LR:5>3): 左孩子一次右旋,根节点一次左旋
3.某某节点的右子树大于兄弟节点的树(RL:6>2): 右孩子一次左旋,根节点一次右旋
4.某某节点的右子树大于兄弟节点的树(RR:7>2): 根节点一次左旋
便利之处就在于SB树删除时不用管,时间复杂度为O(logN)