二叉查找树

平衡二叉树

我们两清 提交于 2020-01-21 08:49:23
一步一步写平衡二叉树(AVL树) 转载: http://www.cppblog.com/cxiaojia/archive/2012/08/20/187776.html   平衡二叉树(Balanced Binary Tree)是二叉查找树的一个进化体,也是第一个引入平衡概念的二叉树。1962年,G.M. Adelson-Velsky 和 E.M. Landis发明了这棵树,所以它又叫AVL树。平衡二叉树要求对于每一个节点来说,它的左右子树的高度之差不能超过1,如果插入或者删除一个节点使得高度之差大于1,就要进行节点之间的旋转,将二叉树重新维持在一个平衡状态。这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间,不过相对二叉查找树来说,时间上稳定了很多。   平衡二叉树实现的大部分过程和二叉查找树是一样的(学平衡二叉树之前一定要会二叉查找树),区别就在于插入和删除之后要写一个旋转算法去维持平衡,维持平衡需要借助一个节点高度的属性。我参考了机械工业出版社的《数据结构与算法分析-C语言描述》写了一个C++版的代码。这本书的AVLTree讲的很好,不过没有很完整的去描述。我会一步一步的讲解如何写平衡二叉树,重点是平衡二叉树的核心部分,也就是旋转算法。 第一步:节点信息

Day 3

依然范特西╮ 提交于 2020-01-18 22:30:55
STL VECTOR动态数组 语句 定义方式:vector a; 在末尾压入容器:a.push_back(x); 在末尾弹出容器:a.pop_back(); 清空容器:a.clear(); 查询元素个数:a.size(); 首指针:a.begin(); 插入元素在sit位置:a.insert(sit,x);其中sit是vector的迭代器。 其它像数组一样调用就可以了。 看做是一个动态数组 复杂度 访问,添加啥的都是 \(o(1)\) ,但是常数比较大 栈和队列 语句 定义:stack a; 查询栈顶:a.top(); 压入栈顶:a.push(x); 将元素从栈顶弹出:a.pop(); 查询a中的元素个数:a.size(); 清空只能慢慢pop。 队列 定义:queue a; 插入队尾:a.push(x); 删除队首:a.pop(); 查询队尾:a.back(); 查询队首:a.front(); 查询长度:a.size(); 清空只能慢慢pop。 用栈写队列WTF 因为进栈出栈的时间复杂度都是O(1)的 加入的时候先进A再进B 时间复杂度为O(n) MAP •映射,把它看做一个无限大的数组。 •定义方式:map<int ,int> a; •使用方式:a[x]++,cout<<a[y]等。 •利用迭代器查询map里的所有二元组: •for (map<int,int>:

平衡二叉树及其C++实现-AVL

China☆狼群 提交于 2020-01-14 23:56:58
title: 平衡二叉树(AVL) date: 2020-01-14 11:26:36 tags: 数据结构 1.1平衡二叉树的定义 为了解决二叉查找树如果插入的顺序不合适,会导致二叉查找树变成一个单链(可以看二叉查找树文章当中的讨论),例如按照递增序列建立二叉查找树就会导致一边倒的情况,从而无法发挥二叉树可以使得查找保持O(logn)查找的效率。故由使得二叉树的层数越小,导出了平衡二叉树。 AVL依然是一棵二叉查找树 (AVL的命名是由发现这个树的两个苏联科学家G.M.Adekse-Velskil和E.M.Landis提出的),因此一般也称作AVL树。 左子树和右子树的高度之差称为该结点的平衡因子 由于需要对每个结点都要得到平衡因子,故在树的结点中加入一个height用以记录当前结点为根结点的子树的高度 struct node { int v, height; //v为结点权值 height为当前子树高度 node *lchild, *rchild; //左右孩子结点地址 }; 新建结点写法: node* newNode(int v) { node* Node = new node; Node->v = v; //结点权值 Node->height = 1; //结点高度初始为1 Node->lchild = Node->rchild = NULL; //初始状态无左右孩子

红黑树(一)之 原理和算法详细介绍

隐身守侯 提交于 2020-01-10 08:16:08
概要 前面分别介绍红黑树的 理论知识 、红黑树的 C语言 和 C++的实现 。本章介绍红黑树的Java实现,若读者对红黑树的理论知识不熟悉,建立先学习 红黑树的理论知识 ,再来学习本章。还是那句老话,红黑树的C/C++/Java实现,原理一样,择其一了解即可。 目录 1. 红黑树的介绍 2. 红黑树的Java实现(代码说明) 3. 红黑树的Java实现(完整源码) 4. 红黑树的Java测试程序 转载请注明出处: 更多内容: 数据结构与算法系列 目录 (01) 红黑树(一)之 原理和算法详细介绍 (02) 红黑树(二)之 C语言的实现 (03) 红黑树(三)之 Linux内核中红黑树的经典实现 (04) 红黑树(四)之 C++的实现 (05) 红黑树(五)之 Java的实现 (06) 红黑树(六)之 参考资料 红黑树的介绍 红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找树。 红黑树是特殊的二叉查找树,意味着它满足二叉查找树的特征:任意一个节点所包含的键值,大于等于左孩子的键值,小于等于右孩子的键值。 除了具备该特性之外,红黑树还包括许多额外的信息。 红黑树的每个节点上都有存储位表示节点的颜色,颜色是红(Red)或黑(Black)。 红黑树的特性: (1) 每个节点或者是黑色,或者是红色。 (2) 根节点是黑色。 (3) 每个叶子节点是黑色。

二叉查找树(查找、插入、删除)——C语言

瘦欲@ 提交于 2020-01-08 06:29:48
AVL树 平衡二叉查找树(Self-balancing binary search tree)通常是指一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且任意节点的左右两个子树都是一棵平衡二叉树(即严格的平衡二叉查找树, “严格”二字体现在任意节点的左右子树高度差不超过1 ),平衡二叉树有多种实现方法(红黑树、AVL、替罪羊树、Treap、伸展树等) 本篇随笔分析的AVL树( AVL树是根据它的发明者G. M. A delson- V elskii和 E. M. L andis命名的 ),是在二叉查找树的基础上一个优化版本(AVL树是严格的二叉查找树,而红黑树不是,红黑树是非严格的二叉查找树,红黑树有自己的一套规则来保证整棵树接近平衡) AVL树的特点: 1.本身首先是一棵二叉查找树 2.带有平衡条件:每个结点的左右子树的高度之差的绝对值不超过1, 也就是说,AVL树,本质上是带了平衡功能的二叉查找树 如果读者关于二叉查找树还不了解可以看一下这篇随笔: 二叉查找树(查找、插入、删除) AVL树的作用 AVL树解决了二叉查找树可能出现的极端情况,对于一般的二叉搜索树(Binary Search Tree),其期望高度(即为一棵平衡树时)为log2n,其各操作的时间复杂度(O(log2n))同时也由此而决定,但是在某些极端情况下 (如在插入的序列是有序的时)

AVL树---平衡的二叉查找树

南楼画角 提交于 2020-01-08 02:35:08
AVL树 是每个结点的左子树和右子树的高度最多差1的 二叉查找树 (空树的高度定义为-1)。 它能保持二叉树的高度平衡,尽量降低二叉树的高度,减少树的平均搜索长度。 AVL树的性质 : 左子树和右子树的高度差不超过1 每个结点的左子树和右子树都是AVL树 每个结点都有一个平衡因子,任一结点的平衡因子是-1,0,1。每个结点的平衡因子等于右子树高度减去左子树的高度 AVL树是在二叉查找树的基础上建立的,我们知道二叉查找树在最坏情况下(每个结点只有左子树或右子树)增删查的时间复杂度是O(N),这种极端的情况下树是高度不平衡的。 在二叉查找树的基础上,如果使左右子树的高度差不超过1,即达到高度平衡的状态,此时增删查的时间复杂度为O(logN)(2为底数)。 为了让它保持高度平衡,我们引入了平衡因子,每个结点的平衡因子只可能是-1,0,1中的一个。 每次插入/删除一个结点,我们都需要向上更新一下新增结点/删除结点的祖先的平衡因子。一旦发现某个祖先的平衡因子变为2或者-2,我们就需要通过旋转来使这棵树保持AVL树的特性。 来源: https://www.cnblogs.com/i-hard-working/p/10749998.html

Red Black Tree 红黑树 AVL trees 2-3 trees 2-3-4 trees B-trees Red-black trees Balanced search tree 平衡搜索树

点点圈 提交于 2020-01-04 03:02:56
小结: 1、红黑树:典型的用途是实现 关联数组 2、旋转 当我们在对红黑树进行插入和删除等操作时,对树做了修改,那么可能会违背红黑树的性质。 为了保持红黑树的性质,我们可以通过对树进行旋转,即修改树中某些结点的颜色及指针结构,以达到对红黑树进行插入、删除结点等操作时,红黑树依然能保持它特有的性质(五点性质)。 https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-046j-introduction-to-algorithms-sma-5503-fall-2005/video-lectures/lecture-10-red-black-trees-rotations-insertions-deletions/lec10.pdf Balanced search trees Balanced search tree: A search-tree data structure for which a height of O(lg n) is guaranteed when implementing a dynamic set of n items. AVL trees 2-3 trees 2-3-4 trees B-trees Red-black trees 【1】 Example of a

等价二叉查找树

南楼画角 提交于 2019-12-23 03:54:28
练习:等价二叉查找树 实现 Walk 函数。 测试 Walk 函数。 函数 tree.New(k) 用于构造一个随机结构的已排序二叉查找树,它保存了值 k, 2k, 3k, …, 10k。 创建一个新的信道 ch 并且对其进行步进: go Walk(tree.New(1), ch) 然后从信道中读取并打印 10 个值。应当是数字 1, 2, 3, …, 10。 用 Walk 实现 Same 函数来检测 t1 和 t2 是否存储了相同的值。 测试 Same 函数。 Same(tree.New(1), tree.New(1)) 应当返回 true,而 Same(tree.New(1), tree.New(2)) 应当返回 false。 Tree 的文档可在这里找到。 package main import ( "fmt" "golang.org/x/tour/tree" ) // Walk 步进 tree t 将所有的值从 tree 发送到 channel ch。 func Walk ( t * tree . Tree , ch chan int ) { // 递归到最左端 if nil != t . Left { Walk ( t . Left , ch ) } // L > R // 步进读取R ch <- t . Value if nil != t . Right { Walk

二叉查找树、平衡二叉树(AVLTree)、平衡多路查找树(B-Tree),B+树

一世执手 提交于 2019-12-10 12:15:30
B+树索引是B+树在 数据库 中的一种实现,是最常见也是数据库中使用最为频繁的一种索引。 B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的。 在讲B+树之前必须先了解 二叉查找树 、 平衡二叉树(AVLTree) 和 平衡多路查找树(B-Tree) ,B+树即由这些树逐步优化而来。 二叉查找树 二叉树具有以下性质:左子树的键值小于根的键值,右子树的键值大于根的键值。 如下图所示就是一棵二叉查找树, 对该二叉树的节点进行查找发现深度为1的节点的查找次数为1,深度为2的查找次数为2, 深度为n的节点的查找次数为n, 因此其平均查找次数为 (1+2+2+3+3+3) / 6 = 2.3次 二叉查找树可以任意地构造,同样是2,3,5,6,7,8这六个数字,也可以按照下图的方式来构造: 但是这棵二叉树的查询效率就低了。因此 若想二叉树的查询效率尽可能高,需要这棵二叉树是平衡的,从而引出 新的定义——平衡二叉树,或称AVL树 。 平衡二叉树(AVL Tree)----(基于【二插树】改善,查询效率提高) 平衡二叉树(AVL树)在符合二叉查找树的条件下, 还满足任何节点的两个子树的高度最大差为1 。 下面的两张图片: 左边是AVL树,它的任何节点的两个子树的高度差<=1; 右边的不是AVL树,其根节点的左子树高度为3,而右子树高度为1;

数据结构与算法——常用数据结构及其Java实现

懵懂的女人 提交于 2019-12-09 18:27:30
本文采用Java语言来进行描述,帮大家好好梳理一下,在工作和面试中用的上数据结构与算法。亦即总结常见的的数据结构,以及在Java中相应的实现方法,务求理论与实践一步总结到位。 常用数据结构 数组 数组是相同数据类型的元素按一定顺序排列的集合,是一块连续的内存空间。数组的优点是:get和set操作时间上都是O(1)的;缺点是:add和remove操作时间上都是O(N)的。 Java中,Array就是数组,此外,ArrayList使用了数组Array作为其实现基础,它和一般的Array相比,最大的好处是,我们在添加元素时不必考虑越界,元素超出数组容量时,它会自动扩张保证容量。 Vector和ArrayList相比,主要差别就在于多了一个线程安全性,但是效率比较低下。如今java.util.concurrent包提供了许多线程安全的集合类(比如 LinkedBlockingQueue),所以不必再使用Vector了。 链表 链表是一种非连续、非顺序的结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,链表由一系列结点组成。链表的优点是:add和remove操作时间上都是O(1)的;缺点是:get和set操作时间上都是O(N)的,而且需要额外的空间存储指向其他数据地址的项。 查找操作对于未排序的数组和链表时间上都是O(N)。 Java中,LinkedList 使用链表作为其基础实现。