为什么采用树的结构?
层次管理具有更高的效率
术语
结点的度:结点的子树个数
树的度:树中所有结点中最大的度
叶结点:度为0的结点
父结点:有子树的结点是其子树的根结点的父结点
子结点:若A是B的父结点,B就是A的子结点
二叉树
度为2的树(树中所有结点中最大的度)
子树有左右顺序之分
哈夫曼树
构造一棵二叉树,该树的带权路径长度达到最小,称为最优二叉树,也称为哈夫曼树(Huffman Tree)
平衡二叉树
它是一 棵二叉排序树,它的左右两个子树的高度差(平衡因子)的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
目的:使得树的高度最低,因为树查找的效率决定于树的高度
*红黑树
一种特殊的二叉查找树,红黑树能够以O(log2(N))的时间复杂度进行搜索、插入、删除操作。此外,任何不平衡都会在3次旋转之内解决。
- 节点非红即黑
- 根节点是黑色
- 所有NUll节点称为叶子节点,且认为颜色为黑
- 所有红色节点的子节点都为黑色
- 从任一节点到其叶子节点的所有路径上都包含相同数目的黑节点
从根到叶子的最长的路径不多于最短的可能路径的两倍长,红黑树高度是平均log(n),且最坏情况高度不会超过2log(n)
红黑树的插入操作
插入原则:因为插入节点的颜色如果为黑肯定破坏红黑树性质5,所以每次插入的点首先都是红结点
情况1: 插入的新节点N位于树的根上、插入的新节点的父节点是黑色
情况2: 如果新节点的父节点(0008)和叔父节点(0017)都是红色节点,先插入新节点(红色),(变色)新节点的父节点、叔父节点、祖父节点都需要变色
情况3: 如果新节点的父节点是红色同时叔父节点都是黑色,同时新节点是其父节点的左子节点而父节点又是其父节点的左子节点。我们进行一次右旋转调换新节点和其父节点的角色(以父节点为轴)
情况4: 如果新节点的父节点是红色同时叔父节点都是黑色,同时新节点是其父节点的右子节点而父节点又是其父节点的右子节点。我们对祖父节点进行一次左旋转调换新节点和其父节点的角色(以父节点为轴)
情况5: 如果新节点的父节点是红色同时叔父节点都是黑色,同时新节点是其父节点的右子节点而父节点又是其父节点的左子节点。我们进行一次左旋转调换新节点和其父节点的角色(第一次旋转),同时我发现节点(0008)符合情况3,再进行一次右旋转(第二次旋转)
情况6: 如果新节点的父节点是红色同时叔父节点都是黑色,同时新节点是其父节点的左子节点而父节点又是其父节点的右子节点。我们进行一次右旋转调换新节点和其父节点的角色(第一次旋转),同时我发现节点(0017)符合情况4,再进行一次左旋转(第二次旋转)