标签:ali 一个 情况下 性能 就会 遇到 插入 extends tab
在二叉查找树中添加元素,改过程类似于树的查找过程,新元素添加为树的叶结点,从根开始,沿着每个结点中元素所确定的路径,直到相应地方向上没有子结点为止,此时,将新元素添加为叶结点。
如果没有其他操作,二叉查找树的树形由元素的添加顺序来决定。
注:如果输入是完全有序的,二叉查找树就会退化为一个有序链表,削弱了它本身的价值,如下图所示。
第三种情况,如果被删除结点有两个子结点,在树的更低层找到一个合适的结点来代替它。被删除结点的子结点成为替代结点的子结点。
当从二叉查找树中删除有两个子结点的结点是,比较好的办法是用它的中序后继来取代它,即在中序遍历中排在被删元素之后的那个元素(紧邻的下一个值)
public interface BinarySearchTreeADT<T> extends BinaryTreeADT<T>
{
public void addElement(T element);
//往树中添加一个元素
public T removeElement(T targetElement);
// 从树中删除一个元素
public void removeAllOccurrences(T targetElement);
// 从树中删除所指定元素的任何存在
public T removeMin();
//删除树中最小元素
public T removeMax();
// 删除树中最大元素
public T findMin();
//返回一个指向树中最小元素的引用
public T findMax();
//返回一个指向树中最大元素的引用
}
在平衡二叉树中进行查找,比在退化的树中进行查找的效率高很多。在有n个结点的平衡树中进行查找及添加操作的效率是进行O(log2 n)次比较(最长路径的长度)。树越退化,查找及添加操作的时间复杂度越接近O(n),它抵消了使用查找树带来的益处。
可以对二叉查找树进行旋转以恢复平衡
右旋转
1.令根的左子结点变为新的根
2.令原根结点变为新的根结点的右子结点
3.令原根的左子结点的右子结点变为原根结点的新的左子结点
1.令根的右子结点变为新的根
2.令原根结点变为新的根结点的左子结点
3.令原根的右子结点的左子结点变为原根结点的新的右子结点
并非所有的不平衡情况都可以用一个单一的旋转解决,如果不平衡性是由根的右子结点的左子树的长路径引发的,则必须先绕那个异常子树执行一次右旋转,然后再绕根执行一次左旋转(右-左旋转)。如果不平衡是由根的左子结点的右子树中的长路径引发,则执行(左-右旋转)
- 红黑树(RBT)是具有以下性质的二叉查找树:
- 1.节点非红即黑。
- 2.根节点是黑色。
- 3.所有NULL结点称为叶子节点,且认为颜色为黑。
- 4.所有红节点的子节点都为黑色。
- 5.从任一节点到其叶子节点的所有路径上都包含相同数目的黑节点。
显然红黑树的平衡性能比AVL的略差些,但是经过大量试验证明,实际上红黑树的效率还是很不错了,仍能达到O(logN)
没有测试
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | |
---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 |
第一周 | 0/0 | 1/1 | 8/8 |
第二周 | 671/671 | 1/2 | 17/25 |
第三周 | 345/1016 | 1/3 | 15/40 |
第四周 | 405/1421 | 2/5 | 23/63 |
第五周 | 1202/2623 | 1/5 | 20/83 |
第六周 | 1741/4364 | 1/6 | 20/103 |
第七周 | 400/4764 | 1/7 | 20/123 |
2018-2019-20172321 《Java软件结构与数据结构》第七周学习总结
标签:ali 一个 情况下 性能 就会 遇到 插入 extends tab
原文地址:https://www.cnblogs.com/N-idhogg/p/9894910.html