数据结构-树型结构 度:节点拥有的子节点的数量称为节点的度数(Degree),而树的度数是所有节点中度数的最大值。 树的种类: 1、二叉树 二叉树中,任意的一个节点的度必须小于或等于2 节点:在树结构中,每一个元素称为节点 度:每一个节点的子节点的个数。 2、二叉查找树 二叉查找树也叫【二叉排序树】,也叫【二叉搜索树】 每一个节点上最多有两个子节点。 左子树上所有节点的值都小于根节点的值 右子树上所有节点的值都大于根节点的值 二叉查找树添加子节点的时候,要求: 比父节点小的放左边 比父节点大的放右边 一样的不放 3、平衡二叉搜索树 AVL树 要求二叉树的左右子树的高度差不能超过1。 要求任意的节点的左右两个子树都是一棵平衡二叉树 平衡二叉树旋转 旋转触发的时机:当添加一个节点之后,这棵树不再是平衡二叉树的时候,就会进行旋转。 二叉树的旋转: 左旋: 把根节点右侧往左拉,原来的右子节点变为新的父节点,并且把多余的左子节点让出, 给降级的根节点当右子节点。 右旋: 就是把根节点左侧往右拉,原来的左子节点变为新的父节点,并且把多余的右子节点让出, 给降级的根节点当左子节点。 触发平衡二叉树旋转的四种情况: 左左: 当根节点左子树的左子树有节点插入,导致二叉树不平衡。 旋转方式:直接对整体进行右旋即可 左右: 当根节点左子树的右子树有节点插入,导致二叉树不平衡。 旋转方式:先在左子树对应的节点位置进行左旋,然后再对整体进行右旋 右右: 当根节点右子树的右子树有节点插入,导致二叉树不平衡。 旋转方式:直接对整体进行左旋即可 右左: 当根节点右子树的左子树有节点插入,导致二叉树不平衡。 旋转方式:先在右子树对应的节点位置进行右旋,然后再对整体进行左旋 4、红黑树 每一个节点可以是【红】或者是【黑】 红黑树不是高度平衡的,它的平衡是通过自己的【红黑规则】来实现的 红黑规则: 1、每一个节点要么是红色的,要么是黑色的。 2、根节点必须是黑色的。 3、如果一个节点没有子节点(叶子节点)或者没有父节点(根节点), 那么该节点相应的指针属性值为Nil,这些Nil是为叶子节点,每个叶子节点是黑色的。 4、如果一个节点是红色的,那么它的子节点必须是黑色的(不能出现两个红色节点相连的情况) 5、每一个节点,从该节点开始到后面的所有叶子节点的简单路径上,都要包含相同个数的黑色节点。 添加节点的时候,新节点的颜色可以是红色也可以是黑色。建议默认的颜色是红色,可以提高效率。 当我们添加节点后,为了保持红黑规则: 根节点位置,建议直接设置为黑色。 非根节点位置, |-如果父节点是黑色,那么不用做任何操作,子节点默认红色就行。 |-如果父节点是红色, |-叔叔节点也为红色 把父节点设置为黑色,把叔叔节点设置为黑色 把祖父节点设置为红色 如果祖父节点是根节点,就再次把根节点设置为黑色 |-叔叔节点为黑色 把父节点设置为黑色 把祖父节点设置为红色 再以祖父节点为支点进行旋转