二叉树

数据结构:

  • 平衡二叉树:任意节点的左右子树的高度差不能超过1;

  • 确定支点:从添加的节点开始,不断的父节点找不平衡点;

    • 左旋
      • 【确定支点在根节点的右子树】:
        1. 以不平衡点作为支点;
        2. 把支点左旋转降级,变成左节点;
        3. 晋升原来的右节点;
      • 【确定支点在根节点】
        1. 以不平衡点作为支点;
        2. 将根节点左旋转,降级,为根的左节点;
        3. 晋升根节点的右节点,为根节点
        4. 原来右节点的的左节点,变为现在左节点的右子节点;
    • 右旋转:
      • 【确定支点在根节点的左子树】:
        1. 以不平衡点作为支点;
        2. 把支点右旋转降级,变成右节点;
        3. 晋升原来的左节点;
      • 【确定支点在根节点】
        1. 以不平衡点作为支点;
        2. 将根节点右旋转,降级,为根的右节点;
        3. 晋升根节点的左节点,为根节点
        4. 原来左节点的的右节点,变为现在右节点的左子节点;
    • 导致不平衡的四种情况:
      1. 左左【节点添加到根节点的左子树左子树上导致不平衡】:一次右旋;
      2. 左右:先局部左旋,在整体右旋;
      3. 右右:一次左旋;
      4. 右左:先局部右旋,在整体左旋;
  • 红黑树:一种特殊的二叉查找树;

    • 没有平衡二叉的条件严格;

    • 红黑树的每一个节点,都右储存位标识节点的颜色;

    • 红黑树规则:

      • 每一个节点:不是红色就是黑色;
      • 根节点必须是黑色;
      • 如果一个节点,没有子节点或者父节点,则该节点相应指针属性值为nil,这些nil视为叶节点,且每个叶节点都是黑色的【红色节点不能作为结尾】;
      • 如果一个节点是红色的,那么他的子节点必须是黑色的【不能出现两个红色节点相连的情况】;
      • 对于每个节点,从该节点到其所有后代叶节点的简单路径【不能回头】上,均包含相同数目的黑色节点;
    • 添加节点规则:

      • 添加节点默认是红色的效率更高;
      • 添加为根节点,直接变为黑色;
      • 添加节点为非根节点:
        • 父为黑色节点,不需要操作【默认颜色的作用】;
        • 父为红色【相邻不能同为红色】:
          • 叔叔为红色节点时:
            • 将父和叔,都设置为黑色节点;
            • 将祖父设置为红色节点;
            • 如果祖父为根节点,则变为黑色节点;
            • 如果祖父不是根节点,将祖父作为当前节点【添加节点】,在进行重新判断;
          • 当叔叔为黑色节点:
            • 当前节点是父节点的右节点时:
              • 把父作为当前节点,并左旋,在进行重新判断;
            • 当前节点是父节点的左节点时:
              • 将父节点设置为黑色,
              • 祖父变为红色;
              • 以祖父节点为支点进行右旋转【旋转不考虑nil节点】;
posted @ 2025-03-02 16:36  烟雨断桥  阅读(12)  评论(0)    收藏  举报