高级数据结构实现——自顶向下伸展树

【0】README

1) 本文部分内容转自 数据结构与算法分析,旨在理解 高级数据结构实现——自顶向下伸展树 的基础知识;
2) 源代码部分思想借鉴了数据结构与算法分析,有一点干货原创代码,for original source code, please visit https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/chapter12/p345_topdown_splay_tree
3) you can also refer to the link http://www.cnblogs.com/huangxincheng/archive/2012/08/04/2623455.html
4) for basic splay tree , please visit http://blog.csdn.net/PacosonSWJTU/article/details/50525435


【1】自顶向下伸展树相关

1)problem+solution

  • 1.1)problem: 普通伸展树的展开操作需要从根沿树往下的一次遍历, 以及而后的从底向上的一次遍历。(详情,参见: http://blog.csdn.net/pacosonswjtu/article/details/50525435) 这可以通过保存一些父指针来完成, 或者通过将访问路径存储到一个栈中来完成。 但遗憾的 是, 这两种方法均需要大量的开销 ;
  • 1.2)solution: 本节中, 我们指出如何在初始访问路径上施行一些旋转。结果得到在时间中更快的过程,只用到 O(1)的额外空间, 但却保持了 O(logN) 的摊还时间界;(干货——伸展树是基于AVL树的, 在AVL的基础上引入伸展树的目的是保持他的摊还时间界为 O(logN))

2)对伸展树的自顶向下的旋转操作:(单旋转+一字型旋转+之字型旋转)

  • 2.1)这种伸展方式会把树切成三份,L树,M树,R树,考虑的情况有:单旋转,“一字型”旋转,“之字形”旋转。起初左树(L) 和 右树(R)均为空(NULL);
    这里写图片描述

    这里写图片描述

3)看个荔枝:

  • 3.1)splay + deleting opeartions:

  • 3.2)inserting opeartions:

4)source code at a glance

#include "topdown_splay_tree.h" // allocate memory for new node.
Node makeNode(int value)
{Node node;node = (Node)malloc(sizeof(struct Node));if(!node){Error("failed makeNode, for out of space !");return NULL;}node->left = NULL;node->right = NULL; node->value = value;return node;
}// left left single rotate
TopDownSplayTree left_left_single_rotate(TopDownSplayTree root)
{       TopDownSplayTree temp;temp = root; // 1st steproot = root->left; // 2nd steptemp->left = root->right; // 3rd steproot->right = temp; // 4th stepreturn root;
}// right_right_single_rotate
TopDownSplayTree right_right_single_rotate(TopDownSplayTree root)
{       TopDownSplayTree temp;temp = root; // 1st steproot = root->right; // 2nd steptemp->right = root->left; // 3rd steproot->left = temp; // 4th step  return root;
}// performing splay operations 
TopDownSplayTree topdown_splay(int value, TopDownSplayTree middle)
{struct Node plusTree;   Node leftTreeMax;   Node rightTreeMin;leftTreeMax = &plusTree;rightTreeMin = &plusTree;while(value != middle->value){   if(middle->value < value)  // the new node is greater.{    if(middle->right == NULL){break;}else if(middle->right->value < value && middle->right->right){middle = right_right_single_rotate(middle);}           leftTreeMax->right = middle;leftTreeMax = middle;middle = middle->right;     leftTreeMax->right = NULL;}if(middle->value > value) // the new node is less.{       if(middle->left == NULL){break;}else if(middle->left->value > value && middle->left->left){middle = left_left_single_rotate(middle);}rightTreeMin->left = middle;rightTreeMin = middle;middle = middle->left;rightTreeMin->left = NULL;}   }leftTreeMax->right = middle->left;rightTreeMin->left = middle->right;middle->left = plusTree.right;middle->right = plusTree.left;return middle;
}// delete the root of the  TopDownSplayTree
TopDownSplayTree deleteNode(int value, TopDownSplayTree root)
{TopDownSplayTree newroot;if(root == NULL) {return root;}else // the splay tree is not null{root = topdown_splay(value, root);if(root->value == value)  // find the node with given value.{ if(root->left == NULL){newroot = root->right;}else{newroot = root->left;// perform splay again with value towards the left subtree which is not null.newroot = topdown_splay(value, newroot);newroot->right = root->right; }free(root);root = newroot;}       }   return root;
}// insert the node with value into the TopDownSplayTree
TopDownSplayTree insert(int value, TopDownSplayTree root)
{TopDownSplayTree node;node = makeNode(value);      if(root == NULL) // the splay tree is null{return node;}else // the splay tree is not null{root = topdown_splay(value, root);if(root->value > value)  {node->left = root->left;node->right = root;root->left = NULL;root = node;            }else if(root->value < value)  {node->right = root->right;root->right = NULL;node->left = root;          root = node;}else            {return root;}}   return root;
}// test for insert operation.
int main1()
{TopDownSplayTree root;  int data[] = {5, 11, 23, 10, 17};int size = 5;int i;printf("\n === executing insert with {5, 11, 23, 10, 17} in turn.=== \n");root = NULL;for(i=0; i<size; i++){root = insert(data[i], root);printPreorder(1, root); }       printf("\n === executing insert with 8 in turn.=== \n");root = insert(8, root);printPreorder(1, root);     printf("\n === executing insert with 18 in turn.=== \n");root = insert(18, root);printPreorder(1, root);return 0;
}// test for splay operation and deleting operation.
int main()
{   TopDownSplayTree root;TopDownSplayTree temp;printf("\n ====== test for splaying operation====== \n");printf("\n === original tree is as follows.=== \n");root = makeNode(12); // root = 12temp = root;temp->left = makeNode(5);temp->right = makeNode(25);temp = temp->right;  // root = 25temp->left = makeNode(20);temp->right = makeNode(30);temp = temp->left;  // root = 20temp->left = makeNode(15);temp->right = makeNode(24);temp = temp->left;  // root = 15temp->left = makeNode(13);temp->right = makeNode(18);temp = temp->right;  // root = 18temp->left = makeNode(16);  printPreorder(1, root);printf("\n === executing splay operation with finding value=19.=== \n");root = topdown_splay(19, root);printPreorder(1, root);  printf("\n === executing deleting operation with value=15.=== \n");root = deleteNode(15, root);printPreorder(1, root);  return 0;
}// analog print node values in the binominal tree, which involves preorder traversal. 
void printPreorder(int depth, TopDownSplayTree root)
{           int i;if(root) {       for(i = 0; i < depth; i++)printf("    ");printf("%d\n", root->value);            printPreorder(depth + 1, root->left);                                   printPreorder(depth + 1, root->right);} else{for(i = 0; i < depth; i++)printf("    ");printf("NULL\n");}
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331508.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

测试框架 如何测试私有方法_高效的企业测试–测试框架(5/6)

测试框架 如何测试私有方法本系列文章的这一部分将介绍测试框架以及我在何时以及是否应用它们方面的想法和经验。 关于测试框架的想法 我对大多数测试框架不太满意的原因是&#xff0c;按照我的观点&#xff0c;它们大多增加了语法上的便利性和便利性&#xff0c;但是本质上并…

数据结构(二)之链表反转

一、链表反转 1、反转非递归算法 2、反转递归算法 链表结点&#xff1a; package cn.edu.scau.mk;/**** author MK* param <T>*/ public class Node<T> {private T data;private Node<T> next null;public Node(T data) {this.data data;}public T getD…

web安全测试视频课程专题_有关有效企业测试的视频课程

web安全测试视频课程专题我已经制作了一些有关有效企业测试的视频。 在实际项目中&#xff0c;我仍然认为该主题非常重要。 这是我在测试Enterprise Java项目中的经验以及一些示例。 1.介绍和有效的Maven使用 在此视频中&#xff0c;我将介绍测试过程&#xff0c;并演示如何使…

网络——获取Web数

【0】README 0.1&#xff09; 本文描述转自 core java volume 2&#xff0c; 旨在理解 “网络——获取Web数” 的基础知识&#xff1b; 0.2&#xff09; for source code , please visit https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chap…

数据结构(三)之单链表反向查找

一、反向查找单链表 1、简单查找 先遍历获取单链表单长度n&#xff0c;然后通过计算得到倒数第k个元素的下标为n-k&#xff0c;然后查找下标为n-k的元素。 2、优化查找 先找到下标为k的元素为记录点p1&#xff0c;然后设置新的记录点p2的下标从0开始&#xff0c;同时遍历两个…

java使用:: 表达式_Java 13:切换表达式的增强功能

java使用:: 表达式您可能还记得我以前的文章&#xff0c;在Java 12中&#xff0c;传统的switch语句得到了增强&#xff0c;因此可以用作表达式。 在Java 13中&#xff0c;对该功能进行了进一步的更改 。 break语句不能再返回值。 相反&#xff0c;您必须使用新的yield语句&…

网络——Base64Encode(转:自定义Base64编码器——Base64Encode)

【0】README 0.1&#xff09; 本文source code 转自 core java volume 2 &#xff0c; 旨在了解 如何定义一个 编码器&#xff0c; 如Base64Encode &#xff1b; 0.2&#xff09;注意&#xff1a; 区别自定义的 Base64Encode 和 java.util.Base64 编码器 0.3&#xff09;fo…

数据结构(四)之单链表查找中间结点

一、查找单链表中间结点 1、简单查找 先遍历获取单链表单长度n&#xff0c;然后通过计算得到中间结点为n/2&#xff0c;然后查找下标为n/2的元素。 2、优化查找 先设置记录点fast、slow&#xff0c;下标均从0开始&#xff0c;fast走两步&#xff0c;slow走一步&#xff0c;同…

java面试常见面试问题_Java面试准备:15个Java面试问题

java面试常见面试问题并非所有的访谈都将重点放在算法和数据结构上—通常&#xff0c;访谈通常只侧重于您声称是专家的语言或技术。在此类访谈中&#xff0c;通常没有任何“陷阱”问题&#xff0c;而是它们要求您利用内存和使用该语言的经验–换句话说&#xff0c;它们测试您对…

网络——提交表单数据(post方式)

【0】README 1&#xff09; 本文文字描述 转自 core java volume 2 &#xff0c; 旨在理解 网络——提交表单数据 的基础知识 &#xff1b; 2&#xff09; for source code, please visit https://github.com/pacosonTang/core-java-volume/tree/master/coreJavaAdvanced/cha…

html5实现最智能大气的公司年会抽奖(源码)

文章目录 1.设计来源1.1 主界面1.3 数据配置1.4 抽奖效果1.5 中奖效果 2.效果和源码配置2.1 动态效果2.2 员工信息配置2.3 奖品信息配置2.4 抽奖音效配置2.5 源代码2.6 项目结构 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/…

Linux入门(一)之权限指令系统管理

一、权限指令 普通用户需要使用sudo或者root超级管理员可以执行权限指令。 二、linux系统init程序 &#xff08;1&#xff09;运行init程序&#xff08;引用runoob.com&#xff09; init 进程是系统所有进程的起点&#xff0c;你可以把它比拟成系统所有进程的老祖宗&#xf…

java jsf_使用Java和JSF构建一个简单的CRUD应用

java jsf使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证&#xff0c;管理和保护。 今天尝试Okta。 JavaServer Faces&#xff08;JSF&#xff09;是用于构建Web应用程序的Java框架&#xff0c;其中心是作为用户…

网络——发送email(一个简单荔枝)

【0】README 1&#xff09; 本文文字描述 转自 core java volume 2 &#xff0c; 旨在理解 网络——发送email 的基础知识 &#xff1b; 2&#xff09; for souce code , please visit https://github.com/pacosonTang/core-java-volume/tree/master/coreJavaAdvanced/chapte…

算法七之希尔排序

一、希尔排序 &#xff08;1&#xff09;简介 希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序&#xff0c;是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL&#xff0e;Shell于1959年提出而得名。希尔排序是把记录按下标的一定增量…

cuba 平台_CUBA平台:TypeScript SDK和REST API

cuba 平台在本文中&#xff0c;我们将讨论已存在很长时间但尚未广为人知的CUBA平台的功能- 前端SDK生成器 &#xff0c;并了解它如何与CUBA的REST API插件一起使用 。 Java JavaScript –网络婚姻 仅八年前&#xff0c;我们Java开发人员在我们的Web应用程序中使用JavaScript作…

算法八之归并排序

一、归并排序原理 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序…

数据库编程——intro to JDBC

【0】README 1&#xff09; 本文文字描述 转自 core java volume 2 &#xff0c; 旨在理解 数据库编程——JDBC 的基础知识 &#xff1b; 2&#xff09;JDBC起源&#xff1a; 96年&#xff0c; Sun公司发布了 第一版的java 数据库连接&#xff08;JDBC&#xff09;API&#…

java \t怎么从头开始_通过这些简单的步骤从头开始学习Java

java \t怎么从头开始Java是用于软件开发的最受欢迎的编程语言之一。 无论您的最终目标或技能水平如何&#xff0c;学习和掌握Java都将为您作为开发人员打开大门。 今天&#xff0c;我们将讨论一些原因&#xff0c;我们认为您应该开始学习Java&#xff0c;然后提供有关入门的深入…

HDFS 的dao

一、HDFS dao接口package cn.mk.dao;import java.io.FileNotFoundException; import java.io.IOException;import org.apache.hadoop.fs.BlockLocation; import org.apache.hadoop.fs.FileStatus;public interface HDFSDao {public boolean mkDirs(String path) throws IOExcep…