平衡二叉树(Balanced Binary Tree)是二叉查找树的一个进化体,也是第一个引入平衡概念的二叉树。1962年,G.M. Adelson-Velsky 和 E.M. Landis发明了这棵树,所以它又叫AVL树。平衡二叉树要求对于每一个节点来说,它的左右子树的高度之差不能超过1,如果.....
分类:
其他好文 时间:
2014-08-18 10:26:43
阅读次数:
187
当二叉树在某些情况下退化为类单链表时,它的查找、插入、删除运算复杂度将不再是O(logN)),解决问题的方法就是尽量维持树的平衡。节点的平衡因子定义为左子树高度减去右子树高度,AVL树中每个节点平衡因子为0,1,-1;具体代码: 1 #include 2 #include 3 using na...
分类:
其他好文 时间:
2014-08-17 17:01:22
阅读次数:
323
原本打算用 Cpp,Ada,Python 各重写一份,觉得这种行为比较2.
因为还是 Scheme 的表达最优雅.
#lang scheme
( define nil '() )
( define ( root tree )( car tree ) )
( define ( left-tree tree )( cadr tree ) )
( define ( right...
分类:
其他好文 时间:
2014-08-17 01:06:41
阅读次数:
266
1. 二叉平衡树二叉排序树的时间复杂度和树的深度n有关。当先后插入的结点按关键字有序时,二叉排序树退化为单枝树,平均查找长度为(n+1)/2,查找效率比较低。提高查找效率,关键在于最大限度地降低树的深度n。因此需要在构成二叉排序树的过程中进行“平衡化”处理,使之成为二叉平衡树。二叉平衡树,又称AVL...
分类:
其他好文 时间:
2014-08-16 23:44:01
阅读次数:
291
STL中,关联式容器的内部结构是一颗平衡二叉树,以便获得良好的搜索效率。红黑树是平衡二叉树的一种,它不像AVL树那样要求绝对平衡,降低了对旋转的要求,但是其性能并没有下降很多,它的搜索、插入、删除都能以O(nlogn)时间完成。平衡可以在一次或者两次旋转解决,是“性价比”很高的平衡二叉树。...
分类:
其他好文 时间:
2014-08-15 22:36:59
阅读次数:
445
伸展树和AVL树不一样,伸展树并不保证每次操作的时间复杂度为O(logn),而保证任何一个m个操作的序列总时间为O(mlogn)。伸展树的基本思想是:每个结点被访问时,使用AVL树的旋转操作把它移动到根。由于旋转是自底向上的,所以需要设置父亲指针,而不像AVL树那样以儿子为轴旋转。伸展操作(spla...
分类:
其他好文 时间:
2014-08-14 23:30:16
阅读次数:
280
public class AVLTree {
public static class AVLTreeNode {
AVLTreeNode mLeftNode;
AVLTreeNode mRightNode;
AVLTreeNode mParent;
public int mHeight;
int mValue;
public AVLTreeNode() {
...
分类:
其他好文 时间:
2014-08-10 15:47:10
阅读次数:
312
平衡二叉查找树
平衡二叉查找树是很早出现的平衡树,因为所有子树的高度差不超过1,所以操作平均为O(logN)。
平衡二叉查找树和BS树很像,插入和删除操作也基本一样,但是每个节点多了一个高度的信息,在每次插入之后都要更新树的每个节点的高度,发现不平衡之后就要进行旋转。
单旋转
单旋转是碰到左左或者右右的情况下所使用的方法。
例如:
3
2
...
分类:
其他好文 时间:
2014-08-10 01:46:39
阅读次数:
238
apache-commons库用tree实现了实现了List的接口,也就是TreeList类。与标准的LinkedList相比,TreeList稍微浪费一点空间,但常用操作的时间复杂度均降低到了O(log N),值得在开发中权衡利弊、合理应用。...
分类:
编程语言 时间:
2014-08-09 23:17:19
阅读次数:
374
声明:本文是对某高中生的竞赛论文学习的文章介绍: 二叉查找树能够支持多种动态集合操作。对于一个含有n个结点的完全二叉树,这些操作的最还情况运行时间是O(lgn),但如果树是含有n个结点的线性链,则这些操作的最坏情况运行时间为O(n)。而像红黑树、AVL树这种二叉查找树的变形在最坏情况下,仍能保持较....
分类:
其他好文 时间:
2014-08-08 01:32:25
阅读次数:
423