二叉排序树

hdu3999 二叉排序树

匿名 (未验证) 提交于 2019-12-03 00:05:01
The order of a Tree Problem Description As we know,the shape of a binary search tree is greatly related to the order of keys we insert. To be precisely: 1. insert a key k to a empty tree, then the tree become a tree with only one node; 2. insert a key k to a nonempty tree, if k is less than the root ,insert it to the left sub-tree;else insert k to the right sub-tree. We call the order of keys we insert “the order of a tree”,your task is,given a oder of a tree, find the order of a tree with the least lexicographic order that generate the same tree.Two trees are the same if and only if they have

splay

匿名 (未验证) 提交于 2019-12-02 23:51:01
(又是一个被我咕咕咕很久了的知识点) 板子题 一、Splay 又叫伸展树,分裂树。是一种二叉排序/查找/搜索树。 Splay是一种平衡二叉树,及优化后的二叉查找树。靠伸展操作splay可以自我调整,使得提升效率 二、二叉排序树的性质 或者是一颗空树 或者具有以下性质: 若左子树不空,则左子树上所有节点的值均小于或等于它的根节点的值 若柚子树不空,则右子树上所有节点的值均大于或等于它的根节点的值 左右子树也分别为二叉排序树 同样的序列,因为排序不同,可能会生成不同的二叉排序树,查找效率性就不一定了。如果傻叉排序树退化成一条链,效率就很低。 三、变量定义 : : val[ x ]代表x存储的值 : cnt[ x ]代表x存储的重复权值的个数 : fa[ x ]代表x的父节点 : siz[ x ]代表x子树下的储存的权值数(包括重复权值,也包括自己) 四、支持的操作 查找第k大的数 查找一个数的排名 查找一个数的前驱 查找一个数的后继 区间翻转 --------------------------------------------------------------------------------- chk:查询一个节点是其父节点的左儿子还是右儿子 pushup:更新siz数组的值 rotate:旋转保持平衡 splay:伸展,将一个节点一直rotate到制定节点的儿子 find

二叉排序树或二叉搜索树

匿名 (未验证) 提交于 2019-12-02 23:34:01
一、二叉树基础 1.1 二叉排序树定义 二叉排序树(Binary Sort Tree)又称二叉查找(搜索)树(Binary Search Tree)。它是一颗空树,或者具有下列性质: 若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树分别为二叉排序树。 上述性质简称二叉排序树性质(BST性质),故二叉排序树实际上是满足BST性质的二叉树。 注意: 当用线性表作为表的组织形式时,可以有三种查找法。其中以二分查找效率最高。但由于二分查找要求表中结点按关键字有序,且不能用链表作存储结构,因此,当表的插入或删除操作频繁时,为维护表的有序性,势必要移动表中很多结点。这种由移动结点引起的额外时间开销,就会抵消二分查找的优点。也就是说,二分查找只适用于静态查找表。若要对动态查找表进行高效率的查找,可采用下二叉树或树作为表的组织形式。不妨将它们统称为树表。 1.2 特点 由BST性质可得: (1) 二叉排序树中任一结点x,其左(右)子树中任一结点y(若存在)的关键字必小(大)于x的关键字。 (2) 二叉排序树中,各结点关键字是惟一的。 注意: 实际应用中,不能保证被查找的数据集中各元素的关键字互不相同,所以可将二叉排序树定义中BST性质(1)里的"小于"改为"大于等于",或将BST性质(2)里的"大于

【数据结构】【平衡树】Treap

匿名 (未验证) 提交于 2019-12-02 22:56:40
百度百科 Pre_knowledge      二叉排序树     二叉排序树是一棵二叉树。每个节点对应一个权值v,对于每个节点,一定满足如下性质:         二叉排序树的每个节点的左子树要么为空,要么左子树的任意节点的权值v‘一定小于v。         二叉排序树的每个节点的有子树要么为空,要么右子树的任意节点的权值v‘一定大于v。     二叉排序树的节点:每个节点维护如下信息:该点代表的权值,该点的左右儿子,以该点为根的子树含有元素的个数(不等于子树大小。因为两个相同的元素被认为含有两个元素,但是对应的节点只有一个),该点代表的权值的元素的个数。     二叉排序树的插入:        对于要插入的值key,比较他与当前节点的权值v关系,如果v>key,则递归插入左子树,        否则,如果v==key,则插入当前节点,即++该点元素个数。        否则,递归插入右子树。     二叉排序树的删除:        递归过程同上。- - 该点元素个数。 Definition     Treap=tree+heap,直译树堆。在形态上,他是一颗BST,即二叉排序树。同时,由于二叉排序树的插入方式过于朴素,导致给出具有单调性的数据后会被卡成一条链,任何操作的复杂度从期望 O(nlogn) 上升到 O(n 2 ) 。为了防止毒瘤出题人造出卡死二叉排序树的数据

AVL平衡二叉查找树

醉酒当歌 提交于 2019-12-01 16:53:59
二叉排序树: 定义 二叉排序树,又叫二叉查找树,它或者是一棵空树;或者是具有以下性质的二叉树: 1. 若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 2. 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值; 3. 它的左右子树也分别为二叉排序树。 比如下图就是一棵普通的二叉排序树: 如果按照中序遍历的顺序,一棵二叉排序树的输出结果就刚好是按照从小到大的顺序输出的,可以运用于二分算法。 先对其数据结构进行定义: typedef struct Binary_Tree_node { int data; //数据域 struct Binary_Tree_node* lchild, * rchild; //左右孩子结点 }Binode, * BiTree; 然后是插入操作: //假设没有相等的data,这里我们不考虑相等的数据 //插入结点 void Insert_Binary_Tree(BiTree& bst ,int t) //bst是根节点 { if (bst == NULL) //空树或者递归到了叶结点 { BiTree newp = new Binode; newp->data = t; newp->lchild = NULL; newp->rchild = NULL; bst = newp; } else { if (t > bst->data) /

Day-06-二分搜索和二叉排序树 Leetcode-35, 34, 33, 449, 315

我与影子孤独终老i 提交于 2019-11-29 15:12:02
目录 例一:LeetCode35 例二:LeetCode34 例三:LeetCode33 例四:LeetCode449 例五:LeetCode315 #include <stdio.h> #include <vector> // //二分查找(递归) // bool binary_search(std::vector<int> &sort_array, int begin, int end ,int target){ // if(begin > end){ // return false; // } // int mid = (begin+end)/2; // if(target == sort_array[mid]){ // return true; // } // else if(target < sort_array[mid]){ // return binary_search(sort_array, begin, mid-1, target); // } // else if(target > sort_array[mid]){ // return binary_search(sort_array, mid+1, end, target); // } // } //二分查找(循环) bool binary_search(std::vector<int>& sort

hdu3999 二叉排序树

夙愿已清 提交于 2019-11-29 13:50:19
The order of a Tree Problem Description As we know,the shape of a binary search tree is greatly related to the order of keys we insert. To be precisely: 1. insert a key k to a empty tree, then the tree become a tree with only one node; 2. insert a key k to a nonempty tree, if k is less than the root ,insert it to the left sub-tree;else insert k to the right sub-tree. We call the order of keys we insert “the order of a tree”,your task is,given a oder of a tree, find the order of a tree with the least lexicographic order that generate the same tree.Two trees are the same if and only if they have

二叉排序树

自闭症网瘾萝莉.ら 提交于 2019-11-28 23:01:15
特点:   若左子树不空,则左子树上所有结点的值均小于它的根结点的值;   若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;   左、右子树也分别为二叉排序树,这点很重要, 代码: 1 package Tree; 2 3 public class SortTree { 4 public static void main(String[] args) { 5 //添加 6 int array[] = {1,4,6,2,8,3,12,90,45,32,89}; 7 BinarySortTree binarySortTree = new BinarySortTree(); 8 //循环添加结点 9 for (int i = 0 ; i < array.length ; i++){ 10 binarySortTree.addNode(new Node(array[i])); 11 } 12 13 //中序遍历 14 binarySortTree.preOrder(); 15 } 16 } 17 class BinarySortTree{ 18 //根结点 19 private Node root; 20 21 public void setRoot(Node root) { 22 this.root = root; 23 } 24 25 //添加结点 26 public

二叉排序树的创建,遍历和删除

旧时模样 提交于 2019-11-28 17:45:39
Binary Sort/Search Tree 为什么会有它 数组 未排序:直接在队尾添加,速度快;查找速度慢。 排序:二分查找,查找速度快;添加新数据,需要找到插入位置移动后面的数组,速度慢 链表 添加快,查找慢; 简介 BST: (Binary Sort(Search) Tree), 对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。 特别说明:如果有相同的值,可以将该节点放在左子节点或右子节点 比如针对前面的数据 (7,3, 10, 12, 5, 1, 9) ,对应的二叉排序树为: 创建二叉排序树 一个数组创建成对应的二叉排序树,并使用中序遍历二叉排序树,比如: 数组为 Array(7, 3, 10, 12, 5, 1, 9) ,创建成对应的二叉排序树。 创建思路: 插入一个节点 如果该节点的值小于根节点的值,此时需要判断根节点的左孩子是否为空,为空则插入该节点;不为空,则以左孩子为当前节点,递归进行添加 如果该节点的值大于根节点的值,此时需要判断根节点的右孩子是否为空,为空则插入该节点;不为空,则以右孩子为当前节点,递归进行添加 遍历思路:(中序)infixOrder 如果当前节点的左孩子不为空,就继续遍历直至为空; 先输出当前节点的值; 如果当先节点的右孩子不为空,就继续遍历直至为空。 删除思路: 分三种情况:

红黑树二叉查找树二叉排序树的理解

断了今生、忘了曾经 提交于 2019-11-28 13:53:51
https://blog.csdn.net/chudelong1/article/details/82698010 感谢,自己记个笔记 二叉查找树(BST)具备什么特性呢? 1.左结点小于或等于根结点的值。 2.右结点大于或等于根结点的值。 3.左、右子树也分别为二叉排序树。 查找 10 很方便查找,等同于二分法查找。 缺点: 如果依次插入如下五个节点:7,6,5,4,3。 虽然也是二叉排序树,这样性能就会很差了。 下面开始说 红黑树 1.节点是红色或黑色。 2.根节点是黑色。 3.每个叶子节点都是黑色的空节点(NIL节点)。 4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点) 5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。 下图中这棵树,就是一颗典型的红黑树: 至于怎么插入数据,一定注意 插入完数据之后要符合上面的所有规则。 如果不符合规则呢?那么要做的操作包括 变色(调整颜色)、旋转(左旋转、右旋转) 变色好理解,就是红的变黑的,黑的变红的。 旋转呢?这也是红黑树自平衡的一个重要操作。 左旋转: 逆时针旋转红黑树的两个节点,使得父节点被自己的右孩子取代,而自己成为自己的左孩子。说起来很怪异,大家看下图: 图中,身为右孩子的Y取代了X的位置,而X变成了自己的左孩子。此为左旋转。 右旋转: 顺时针旋转红黑树的两个节点