二叉树和红黑树

一、二叉树

    1.每个节点最多有两个子节点(度不大于2)
    2.满二叉树:深度为k,有2^k-1个节点
    3.完全二叉树:在满二叉树的基础上右边缺几个口。深度为k,最少2^(k-1)个节点,最多2^k - 1个节点
    4.节点的度:子树的个数。度为0的叫叶子节点,度不为0的叫分支节点
    5.先序遍历(根左右)、中序遍历(左根右)、后序遍历(左右根)、层次遍历(队列实现)

二、二叉查找树

    左小右大,没有值重复的节点
    性能:插入有序时变成斜树,查找O(n);最好的情况是log2n

三、平衡二叉树

    平衡因子绝对值不大于1的二叉查找树,保证效率。eg: AVL树、红黑树等

四、AVL树

    1.AVL旋转操作
        右旋:右移使左儿子变成根. 假设原根为X,左右儿子为L/R,则:把L的右儿子给X当左儿子,再把X给L当右儿子
        左旋:左移使右儿子变成根. 假设原根为X,左右儿子为L/R,则:把R的左儿子给X当右儿子,再把X给R当左儿子

    2.左左场景:直接右旋
       右右场景:直接左旋
       左右场景:先左旋再右旋
       右左场景:先右旋再左旋

    3.AVL树和红黑树的对比
          AVL树的查询更快:AVL高度比红黑树要低;
          红黑树在增删时更快:红黑特性使旋转次数减少,rebalance更快。(红黑树牺牲部分平衡性,换更快的增删.以空间换时间)
          红黑树更常用:TreeMap的key用红黑树排序、HashMap用红黑树解决冲突

五、红黑树

    1.节点是红色或者黑色
    2.根总是黑色
    3.所有叶子节点的空子节点都是黑色
    4.如果节点是红色的,则它的两个子节点都是黑色的(不能有两个连续红色)
    5.从任意节点到其每个叶子的所有路径,都含有相同数量的黑节点 (红黑树的平衡标准:节点到叶子的黑相同就行,不严格要求平衡因子R小于等于1)

    2、红黑树是一种特殊的AVL树(非严格均衡的二叉查找树,是黑色完美平衡),在最坏的情况也有很好效率

    3、结构: color + value + parent + left + right

    4、增删元素时,要保证:没有两个连续红节点、到叶子的黑色数量一样。如果破坏了规矩,则使用【变色】【旋转】维持特征

 5、红黑树新增节点:

     1. 新加入到红黑树中的节点默认为红色:根据上面的规则5,加入新节点之前,根到叶子的黑色数量是相同的,如果加入黑色就破坏规矩了;
     2.1 新节点的parent如果是null或者黑,则直接加挂红色结束;
     2.2 新节点的parent如果是红,则破坏了规矩(两个连续红),此时需要调整:
左左场景:parent是左红且新插入的在左边,构成左左连续红:先右旋,然后根+右变色

左右场景:parent是左红且新插入的在右边,构成左右连续红:先左旋变成上面的左左场景,再解决(右旋,根右变色)

右右场景:parent是右红且新插入的在右边,构成右右连续红:先左旋,然后根+左变色

右左场景:parent是右红且新插入的在左边,构成右左连续红:先右旋变成上面的右右场景,再解决(左旋+根左变色)

 

 6、红黑树删除节点:

    1.子节点两个null:直接当前节点赋null;
    2.子节点一个null:用子替,必要时做简单调整
    3.两个子节点都不是null:找前驱(左子树中最大的值)或者后继(右字数中最小的值)替换掉当前节点的值,然后删除前驱或者后继。前驱和后继最多只有一个子节点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值