二叉查找树,对于每一个结点n,n的左子树中包含的元素都小于n中的元素,n的右子树中包含的元素都大于等于n中的元素,即左子树上的元素小于父结点的值,而右子树上的元素大于等于父结点的值。以下图所示。根结点的左子树每一个元素都小于80,右子树每一个元素都大于80.
查找方法,要断定一个具体的目标是否存在于树中,须要沿着从根开始的路径,根据查找目标是小于仍是大于当前结点的值,相应地转到当前结点的左子结点或右结点。最终或是找到目标元素,或是遇到路径的末端,后者意味着目标不在树中。
在二叉查找树中添加元素,改过程相似于树的查找过程,新元素添加为树的叶结点,从根开始,沿着每一个结点中元素所肯定的路径,直到相应地方向上没有子结点为止,此时,将新元素添加为叶结点。html
若是没有其余操做,二叉查找树的树形由元素的添加顺序来决定。git
注:若是输入是彻底有序的,二叉查找树就会退化为一个有序链表,削弱了它自己的价值,以下图所示。
在二叉查找树中删除元素,要考虑以下三种状况(参考下图):
算法
当从二叉查找树中删除有两个子结点的结点是,比较好的办法是用它的中序后继来取代它,即在中序遍历中排在被删元素以后的那个元素(紧邻的下一个值)数组
在平衡二叉树中进行查找,比在退化的树中进行查找的效率高不少。在有n个结点的平衡树中进行查找及添加操做的效率是进行O(log2 n)次比较(最长路径的长度)。树越退化,查找及添加操做的时间复杂度越接近O(n),它抵消了使用查找树带来的益处。数据结构
能够对二叉查找树进行旋转以恢复平衡学习
右旋转
.net
右旋转
设计
并不是全部的不平衡状况均可以用一个单一的旋转解决,若是不平衡性是由根的右子结点的左子树的长路径引起的,则必须先绕那个异常子树执行一次右旋转,而后再绕根执行一次左旋转(右-左旋转)。若是不平衡是由根的左子结点的右子树中的长路径引起,则执行(左-右旋转)htm
详情见个人实验博客blog
(statistics.sh脚本的运行结果截图)
暂未给出答案
我会像奥德休斯同样, 朝着心中的方向 ,哪怕众神会在彼岸阻挡 。当我须要独自站在 ,远方的沙场 ,武器就是我紧握的梦想 ,而我受过的伤 ,都是个人勋章 。继续加油!
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 188 | 1/1 | 25 | 算法分析 |
第二周 | 70/258 | 1/2 | 15/40 | 《构建之法》7-9章 |
第三周 | 474/732 | 1/3 | 20/60 | 查找和排序 |
第四五六周 | 1313/2045 | 4/7 | 12/72 | 栈和队列 |
第七周 | 890/2935 | 1/8 | 14/86 | 树 |
第八周 | 913/3848 | 1/9 | 20/106 | 二叉查找树 |
第九周 |
(有空多看看现代软件工程 课件 软件工程师能力自我评价表)