标签:insert 情况下 索引 查找树 旋转 isl 情况 节点 条件
高度为h,由2的h次-1个节点构成的二叉树称为满二叉树
高度为h,除第h层外,其它各层节点数都到达最大节点数。且第h层的节点都连续集中在最左边
又称二叉排序树或二叉搜索树。左子树的所有节点值均小于根节点的值,右子树所有节点值均大于根节点的值。且左右子树也分别为二叉排序树。
1.插入操作
(1) 若当前的二叉查找树为空,则插入的元素为根节点
(2) 若插入的元素值小于根节点值,则将元素插入到左子树中
(3) 若插入的元素值不小于根节点值,则将元素插入到右子树中
class Node {
int key;
int value;
Node leftChild;
Node rightChild;
public Node(int key, int value) {
this.key = key;
this.value = value;
}
}
public void insert(int key, int value) {
if (root == null) {
root = new Node(key, value);
return;
}
Node currentNode = root;
Node parentNode = root;
boolean isLeftChild = true;
while (currentNode != null) {
parentNode = currentNode;
if (key < currentNode.key) {
currentNode = currentNode.leftChild;
isLeftChild = true;
} else {
currentNode = currentNode.rightChild;
isLeftChild = false;
}
}
Node newNode = new Node(key, value);
if (isLeftChild) {
parentNode.leftChild = newNode;
} else {
parentNode.rightChild = newNode;
}
}
2.查找操作
public Node find(int key) {
Node currentNode = root;
while (currentNode != null && currentNode.key != key) {
if (key < currentNode.key) {
currentNode = currentNode.leftChild;
} else {
currentNode = currentNode.rightChild;
}
}
return currentNode;
}
对于一颗二叉查找树,其期望高度是log2n(树平衡时),时间复杂度o(log2n)。但是在某些极端情况下,如插入时的序列是有序时,这时将退化成一条链,这时将退化为线性,复杂度将变为n。于是就有了平衡二叉树。
平衡二叉树:左右两个子树的高度差绝对值不超过1.并且左右两个子树都是平衡二叉树。平衡二叉树的常用算法有红黑树、AVL树等。
AVL树得名于它的发明者 G.M. Adelson-Velsky。左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。查找、插入和删除在平均和最坏情况下都是O(logn)。
从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这个树大致上是平衡的。
(1)红黑树放弃了追求完全平衡,追求大致平衡,保证每次插入最多只需要三次旋转就能达到平衡,实现起来也更为简单
(2)平衡二叉树追求绝对平衡,条件比较苛刻,旋转的次数无法预知
(3)如果是增删操作多的话,用红黑树。如果是查询操作多的话,用avl树
B树和平衡二叉树稍有不同的是B树属于多叉树又名平衡多路查找树。数据库索引技术里大量使用者B树和B+树的数据结构
标签:insert 情况下 索引 查找树 旋转 isl 情况 节点 条件
原文地址:https://www.cnblogs.com/muacheng/p/13234542.html