二叉查找树
定义
-
根节点大于左结点,小于右结点
-
存储方式:链式结构的二叉链表,既有info,左孩子,右孩子
递归法实现查找
struct node* find(struct node* root,int x) { if(root) { if(x == root->info) return root; if(x < root->info) return find(root->left) return root->right//only this way } return NULL;//did not find. }
question
-
二叉查找树如何实现插入,删除
-
插入类似查找,只不过是在最后会返回NULL的地方插入一个结点
-
删除比较复杂,但是也不过两种情况,叶子结点和非叶子结点
-
叶子结点中直接删除
-
后者则需要将被删除结点的两棵子树重新接上母树。此时可以从它的子树中找出一个满足定义的结点,将其替补上被删除结点的空缺。经过简单推理,发现这个替补结点肯定是叶子结点,因此我们选择将它的值赋予本应该删除的结点,再将这个替补结点删除。(也许这就是为什么书上叫它替身结点吧,代替别人去死了)
-
-
-
二叉查找树如何查找第几大(小)的结点
-
法一:提示二叉查找树中没有相同的结点,可以增加一个存储空间来表每个结点之后还有多少个结点
-
法二:利用树的遍历
-
拓展
平衡二叉查找树=ACL
-
平衡因子是左子树的高度➖右子树的高度
-
平衡因子在-1,0,1内为正常,超过就需要调整
-
LL,RR,LR,RL,重点秉持一个原则——左<根<右
-
具有n个结点的二叉平衡树的最大高度和最小高度
-
最大:斐波那契数列F(m)={1,1,2,3,5,8,11,......},F(H+2)-1<= H <= F(H+3)-1
-
最小:完全二叉树:[对数]+1
-
可以反过来思考:高度确定,结点数呢?
-
红黑树
-
平衡性比AVL更弱,用红黑结点的约束关系来表示
-
黑结点是主带,红结点是斑纹
-
-
日后了解
B树
-
一个基于大量数据的多路查找树,用来建立索引,索引在内存中,真实数据在外部存储器中。由于访问外部存储器的时间远大于访问内存的时间,因此只需要降低树的高度就可以降低查找时间。
-
根结点和非叶子结点的要求有所不同,后者更严格
-
叶子结点都在同一层,不携带任何信息,表示查找失败
-
拓展:B+树
参考资料
-
张同珍编著 《数据结构——C语言描述(慕课版)》 2018年8月河北第一次印刷 人民邮电出版社 ISBN:978-7-115-47603-6