#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct treenode
{
int key;
int priority;
int flag;
treenode* parent;
treenode* lchild;
treenode* rchild; }node,*pnode;
pnode treeroot=NULL;
void adjusttree(pnode p)
{ if(p->parent==NULL)return;
if(p->priority>=p->parent->priority)return;
if(p->flag==)//p lie in the left subtree, rotate right
{
pnode prt=p->parent,rchild=p->rchild;
if(p->parent->flag==)
{
prt->lchild=rchild;
if(rchild)rchild->parent=prt;
if(rchild)rchild->flag=;
p->rchild=prt;
prt->parent=p;
prt->flag=;
treeroot=p;
p->parent=NULL;
p->flag=;
return;
}
else if(p->parent->flag==)
{
pnode grdp=prt->parent;
prt->lchild=rchild;
if(rchild)rchild->parent=prt;
if(rchild)rchild->flag=;
p->rchild=prt;
prt->parent=p;
prt->flag=;
grdp->lchild=p;
p->parent=grdp;
p->flag=;
adjusttree(p);
}
else if(p->parent->flag==)
{
pnode grdp=prt->parent;
prt->lchild=rchild;
if(rchild)
rchild->parent=prt;
if(rchild)
rchild->flag=;
p->rchild=prt;
prt->parent=p;
prt->flag=;
grdp->rchild=p;
p->parent=grdp;
p->flag=;
adjusttree(p);
} }
else if(p->flag==)//p lie in the right tree, rotate left
{
pnode prt=p->parent,lchild=p->lchild;
if(p->parent->flag==)
{
prt->rchild=lchild;
if(lchild)lchild->parent=prt;
if(lchild)lchild->flag=;
p->lchild=prt;
prt->parent=p;
prt->flag=;
treeroot=p;
p->parent=NULL;
p->flag=;
return; }
else if(p->parent->flag==)
{
pnode grdp=prt->parent;
prt->rchild=lchild;
if(lchild)lchild->parent=prt;
if(lchild)lchild->flag=;
p->lchild=prt;
prt->parent=p;
prt->flag=;
grdp->lchild=p;
p->parent=grdp;
p->flag=;
adjusttree(p);
}
else if(p->parent->flag==)
{
pnode grdp=prt->parent;
prt->rchild=lchild;
if(lchild)lchild->parent=prt;
if(lchild)lchild->flag=;
p->lchild=prt;
prt->parent=p;
prt->flag=;
grdp->rchild=p;
p->parent=grdp;
p->flag=;
adjusttree(p);
} } }
void insert_node(pnode root,pnode p,pnode parent,int flag)
{
if(root==NULL)
{
p->flag=flag;
p->parent=parent;
if(flag==)parent->lchild=p;
if(flag==)parent->rchild=p;
if(p->priority<p->parent->priority)adjusttree(p);
return;
}
if(root->key>=p->key)insert_node(root->lchild,p,root,);
else insert_node(root->rchild,p,root,);
}
pnode createnode(int key,int priority)
{
pnode tmp;
tmp=(pnode)malloc(sizeof(node));
tmp->flag=;
tmp->parent=NULL;
tmp->rchild=NULL;
tmp->lchild=NULL;
tmp->key=key;
tmp->priority=priority;
return tmp;
}
void dsptree(pnode p)
{
if(p)dsptree(p->lchild);
if(p){printf("#%dsubtree key=%d\n",p->flag,p->key);}
if(p)dsptree(p->rchild);
}
int main()
{
treeroot=createnode(,);
pnode n1=createnode(,);
pnode n2=createnode(,);
pnode n3=createnode(,);
pnode n4=createnode(,);
insert_node(treeroot,n1,,);
insert_node(treeroot,n2,,);
insert_node(treeroot,n3,,);
insert_node(treeroot,n4,,);
dsptree(treeroot);
system("pause");
return ;
}

treap树及相关算法的更多相关文章

  1. poj 2761 Feed the dogs (treap树)

    /************************************************************* 题目: Feed the dogs(poj 2761) 链接: http: ...

  2. Treap树

    Treap树算是一种简单的优化策略,这名字大家也能猜到,树和堆的合体,其实原理比较简单,在树中维护一个"优先级“,”优先级“ 采用随机数的方法,但是”优先级“必须满足根堆的性质,当然是“大根 ...

  3. 二叉树-你必须要懂!(二叉树相关算法实现-iOS)

    这几天详细了解了下二叉树的相关算法,原因是看了唐boy的一篇博客(你会翻转二叉树吗?),还有一篇关于百度的校园招聘面试经历,深刻体会到二叉树的重要性.于是乎,从网上收集并整理了一些关于二叉树的资料,及 ...

  4. <转>ML 相关算法参考

    转自 国内外网站如果你想搜索比较新颖的机器学习资料或是文章,可以到以下网站中搜索,里面不仅包括了机器学习的内容,还有许多其它相关领域内容,如数据科学和云计算等.InfoWord:http://www. ...

  5. Treap树理解

    title: Treap树理解 comments: true date: 2016-10-06 07:57:37 categories: 算法 tags: Treap树 树 Treap树理解 简介 随 ...

  6. 【STL学习】堆相关算法详解与C++编程实现(Heap)

    转自:https://blog.csdn.net/xiajun07061225/article/details/8553808 堆简介   堆并不是STL的组件,但是经常充当着底层实现结构.比如优先级 ...

  7. bzoj2141 树状数组套Treap树

    题目大意是在能够改变两个数的位置的情况下计算逆序对数 这因为是动态记录逆序对 本来单纯逆序对只要用树状数组计算即可,但这里因为更新,所以利用TReap树的删点和增加点来进行更新 大致是把每个树状数组所 ...

  8. treap树模板

    ///treap树模板 typedef struct Node ///节点的结构体 { Node *l,*r; int val,pri; ///节点的值和优先级 int sz; ///节点子树的节点数 ...

  9. treap树---营业额统计

    台州学院  2924 描述 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况.Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额 ...

随机推荐

  1. 最新的goldengate monitor 12.1.3已经发布

    Oracle GoldenGate管理包针对OGG提供企业级的监控和管理,包含有如下模块: Oracle Enterprise Manager Plug-in. 利用OEM框架查看.管理和预警OGG ...

  2. mybatis 的 resulttype 和resultMap

    resultType适合返回值比较简单的,比如一个数据类型,或者一个对象.比如对象的情况,是将表的列名和对象的属性一一对应的. 但是resultType无法处理返回值比较复杂的,特别是连接查询,需要用 ...

  3. openstack 中 log模块分析

    1 . 所在模块,一般在openstack/common/log.py,其实最主要的还是调用了python中的logging模块: 入口函数在 def setup(product_name, vers ...

  4. python global vs nonlocal (2)

    上一篇中简述了这两个关键字的基本用法: global用于在局部作用于修改或重定义全局变量 nonlocal用于在内部作用域修改或重定义外部变量(全局变量除外) 这只是很浅的理解方式 注意python的 ...

  5. 渐进记法(O,Ω,Θ)

    第一次在<算法导论>中看到这三种渐进记法的符号,当时对此一窍不通,所以也就没有注意它们,直接把他们忽略了,知道学习算法的时候,才知道当初的做法有多傻,因为一个算法的好坏以及复杂度,可以用它 ...

  6. 20145210姚思羽《Java程序设计》实验一实验报告

    实验一 Java开发环境的熟悉(Linux + Eclipse) 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 实验知识点 1. ...

  7. java作业3

    Java字段初始化的规律: 静态初始化生成实例之后(就是new之后)变成你赋给它的值 ,先执行静态初始化,如果没有实例化,按照初始化块和构造方法在程序中出现的顺序执行. 当多个类之间有继承关系时,创建 ...

  8. mysql [ERROR] Can't create IP socket: Permission denied

    /*************************************************************************** * mysql [ERROR] Can't c ...

  9. libvirtError: no connection driver available for qemu:///system 解决办法

    今天部署了一套K版的OpenStack环境后,启动nova-compute后,日志里狂报如下错误(因为其内部有定时任务需要去连libvirtd进程): 2015-08-14 10:01:00.061 ...

  10. 在双系统( Win7 + Ubuntu )环境下正常删除Ubuntu

    前言 首先切记一点:如果你和我一样使用ubuntu的目的是学习操作系统和Unix网络编程等,那么学习环境搭建好了以后切不要随意更新软件.否则系统崩溃,你又得重新配置各种环境,有多麻烦你懂的. 万一你像 ...