摘要: 伸展树结合了二叉搜索树BST及二叉平衡树AVL的旋转特点,在每一次访问到某节点时都通过旋转将该节点往上推一位,由于没有保存高度信息因为空间复杂度稍优于二叉平衡树。伸展树的插入,删除,搜索的平均时间复杂度均为o(logn),极端情况下为o(n)。伸展树适用于关注用户习惯性行为,用户经常使用的节点将靠近根节点,而用户不经常使用的将远离根节点。具体实现代码为:与BST树实现代码一样,如果伸展树遇到不平衡的情况下,代码中的递归调用将会溢出。 1 template<typename T> 2 struct splay_tree_node 3 { 4 splay_tree_node(con.. 阅读全文
posted @ 2012-10-02 15:42 traits 阅读(319) 评论(0) 推荐(0) 编辑
摘要: 二叉平衡树又称为AVL树。它继承了二叉搜索树的规则,并加了一个规则。它的规则是:1.每个结点的左子树和右子树的高度最多差1.二叉平衡树由于不会产生像二叉搜索树那样的极端情况,所以查找,删除(懒惰删除)的时间复杂度为o(logn)。插入操作需要对树作出调整,所以时间复杂度略高于o(logn)。如图所示,a-1为AVL树,而a-2则不是AVL树。插入操作需要旋转树以维持高度差最多为1这一特点。把必须重新平衡的节点叫作a。由于任意结点最多有两个儿子,因此高度不平衡时,a点的两棵子树的高度差2。将会出现以下四种不平衡的情况:1.对a的左儿子的左子树进行一次插入。2.对a的左儿子的右子树进行一次插入。3 阅读全文
posted @ 2012-10-02 13:08 traits 阅读(1792) 评论(0) 推荐(0) 编辑
摘要: 由于普通链表的查找,删除的时间复杂度为o(n),插入的时间复杂度为o(1),现介绍一种查找,删除,插入的时间复杂度均在o(logn)~o(n)之间的数据结构,这就是二叉搜索树。二叉搜索树的规则:1.每一个父节点都有0~2个子结点,分别为左孩子节点,右孩子节点。2.左孩子节点的值小于父节点的值,父节点的值小于右孩子节点的值。根据第一条规则,我们可以将一个二叉搜索树分解为两个子二叉搜索树加一个根节点。从第二条规则我们可以知道,左子树上的任意节点值都小于根节点值,而右子树上的任意节点值都大于根节点值。如图所示,(a)为二叉搜索树,而(b)不是。因为(b)中左子二叉树上的值为7的节点大于根节点6。具体 阅读全文
posted @ 2012-10-01 15:36 traits 阅读(1651) 评论(0) 推荐(0) 编辑