数据结构树的算法,java树形数据结构

  数据结构树的算法,java树形数据结构

  一.导言:二叉查找树的历史。

  二叉查找树算法是由几位研究人员独立发现的,包括PF Windley、安德鲁唐纳德布思、Andrew Colin和Thomas N. Hibbard。这种算法归功于康威伯纳斯李和大卫惠勒,他们在1960年使用这种算法将标签数据存储在磁带中。最早和最流行的二叉查找树算法之一是Hibbard算法。

  二、二叉查找树数据结构二叉查找树,又称二叉查找树。如果你看到有序二叉树和排序二叉树,是一回事。

  如果任一节点的左子树不为空,则左子树中所有节点的值都小于其根节点的值;如果任一节点的右子树不为空,则右子树中所有节点的值都大于其根节点的值;任意节点的左右子树也是二分搜索法树;二叉查找树在日常开发中应用广泛,比如基于组合模式的规则引擎,就是一个二叉查找树。但是像这样开发用的二叉树场景都是基于配置生成的,所以组合的节点更方便控制树的高度和平衡。这与Java API HashMap中的红黑树不同,红黑树可以在插入节点后保持树的平衡。

  因此,二叉查找树也是一个没有被平衡的基本数据结构。在一定概率下,可能退化为链表,即从近似O(logn)到O(n)的时间复杂度。二叉查找树的平衡解决方案,包括:AVL树,2-3树,红黑树等。这一点福哥将在后续章节中继续实施。

  二叉查找树结构的实现二叉查找树是整个树形结构中最基本的树,也是树形系统中最容易实现的数据结构。然而,使用基于二叉查找树的其他树结构,主要是因为数据结构用于存储和读取数据。然后为了提高吞吐效率,需要尽可能平衡元素的排序,树中需要一些列操作,所以会有不同的结构树实现。

  二叉查找树的实现是最好的基础学习,了解了基本的数据结构之后再扩展学习其他的树结构就更容易了。

  1\.分支定义公共整数值;

  公共节点父节点;

  公共节点左;

  公共节点权限;用于形成树的节点需要包括:值和与之关联的三角形结构,一个父节点和两个子节点。如果AVL树还需要树高,红黑树也需要染色标记。

  2\.插入节点公共节点插入(int e) {

  if (null==root) {

  root=新节点(e,null,null,null);

  尺寸;

  返回根目录;

  }

  //Index要插入的元素的位置,即插入到哪个父元素的下面。

  节点parent=root

  节点搜索=根;

  而(搜索!=空搜索值!=null) {

  parent=search

  if (e search.value) {

  search=search.left

  }否则{

  search=search.right

  }

  }

  //插入元素

  Node newNode=新节点(e,parent,null,null);

  if (parent.value newNode.value) {

  parent.left=newNode

  }否则{

  parent.right=newNode

  }

  尺寸;

  返回newNode

  }首先在插入元素时判断是否有根,如果没有,则创建当前节点的一个根。

  如果当前树有根,则在插入的元素和当前树之间执行节点遍历操作,找到可以插入元素的索引位置父节点(挂在此父节点下)。也就是搜索过程。

  最后,通过为插入的值创建一个节点节点,绑定其父元素,并将新元素挂在索引的父节点下,来插入元素。

  3\.信息节点公共节点搜索(int e) {

  Node node=root

  while(节点!=null node.value!=null node.value!=e) {

  if (e node.value) {

  node=node.left

  }否则{

  node=node.right

  }

  }

  返回节点;

  }值搜索的过程是遍历二叉查找树,不断循环节点,根据节点值的左右匹配,找出最终的等值节点。

  4\.删除节点公共节点delete(int e) {

  node delNode=search(e);

  if (null==delNode)返回null;

  return delete(delNode);

  }

  私有节点删除(节点delNode) {

  if (delNode==null)返回null;

  节点结果=null

  if (delNode.left==null) {

  result=transplant(delNode,delNode . right);

  } else if (delNode.right==null) {

  result=transplant(delNode,delNode . left);

  }否则{

  //因为删除了节点,所以有2个子节点。此时,在该分支下,找到最左边的节点作为小节点。用它来替换被删除的节点。

  node miniNode=getMiniNode(del node . right);

  if(min node . parent!=delNode) {

  //交换位置,用min node的右节点替换min node。

  移植(miniNode,min node . right);

  //提升miniNode到父节点,设置右边子树,挂链。要删除的替代点

  min node . right=del node . right;

  min node . right . parent=min node;

  }

  //交换位置、删除节点和miniNode可打印测试观察;system . out . println(this);

  移植(delNode,mini node);

  //提升miniNode到父节点,设置左子树,挂链。

  min node . left=del node . left;

  min node . left . parent=min node;

  result=miniNode

  }

  尺寸-;

  返回结果;

  }

  私有节点getMinimum(Node node) {

  while (node.left!=null) {

  node=node.left

  }

  返回节点;

  }

  私有节点移植(节点delNode,节点addNode) {

  if (delNode.parent==null) {

  this.root=addNode

  }

  //确定被删除的元素是左/右节点。

  else if(del node . parent . left==del node){

  del node . parent . left=add node;

  }否则{

  del node . parent . right=add node;

  }

  //设置父节点

  if (null!=addNode) {

  add node . parent=del node . parent;

  }

  返回addNode

  }4.1删除单个节点

  删除节点14,判断这个节点的父节点的子节点,等于14,找出左右节点。

  将要删除的点的右子节点挂在已删除节点的右节点上。

  将上层父节点设置为要删除的点的右侧子节点。

  4.2删除双节点

  如果要删除的节点64包含两个孩子,则需要根据第一个右孩子找到最小的左孩子。从89到72,如果有小于72的左子节点,继续故障排除。检查节点72,并将准备替换要删除的元素的节点72的位置与右子节点73交换。过程与4.1中的相同。最后,使用交换函数移植将节点72与要删除的节点64交换,三角关系、父节点、左子节点和右子节点被替换。4.二叉查找树的功能测试。为了方便观察树木结构的变化,在这里,付晓师兄找到了一些资料。一种是我们可以通过程序打印出来(类似于之前打印99张乘法表,另一种是使用在线可视化:https://visualgo.net/zh/bst?幻灯片=1)

  1\.随机插入@Test元素

  公共void test_binary_search_tree() {

  binary search tree tree=new binary search tree();

  for(int I=0;i i ) {

  tree.insert(new Random()。nextInt(100));

  }

  system . out . println(tree);

  }测试结果/- 91

   \ - 78

  /- 74

   \ - 67

  61

  /- 51

  \ - 40

  /- 28

  \ - 14

  \ - 7

  进程以退出代码0结束因为你测试的随机数是不同的,可能有许多不同结构的二分搜索法树,或者一个退化的树有相似的链表结构。

  2\.插入和删除@Test

  public void test _ insert _ delete(){

  binary search tree tree=new binary search tree();

  tree . insert(32);

  tree . insert(7);

  tree . insert(64);

  tree . insert(63);

  tree . insert(89);

  tree . insert(72);

  tree . insert(94);

  tree . insert(6);

  tree . insert(14);

  tree . insert(18);

  tree . insert(73);

  system . out . println(tree);

  //删除只有一个子级父节点的单个节点。

  //tree . delete(14);

  //删除双节点,即有两个子节点的父节点

  tree . delete(64);

  system . out . println(tree);

  }测试结果/- 94

  /- 89

   /- 73

   \ - 72

  /- 64

   \ - 63

  32

  /- 18

  /- 14

  \ - 7

  \ - 6

  /- 94

  /- 89

   \ - 73

  /- 72

   \ - 63

  32

  /- 18

  /- 14

  \ - 7

  \ - 6

  以退出代码0结束流程的情况是在4.2中删除两个节点的情况。删除节点64后,提取并使用节点72。读者也可以尝试删除其他节点测试验证。

  动词(verb的缩写)常见面试问题的二叉查找树结构简介。改T的可能性也可以手写。

  插入、删除和索引二叉查找树的时间复杂度。

  在二叉查找树删除具有双节点的元素的过程描述。

  二叉查找树的节点包含哪些信息?

  为什么Java HashMap说红黑树而不是二叉查找树?

  版权归作者所有:原创作品来自博主小二上九8,转载请联系作者取得转载授权,否则将追究法律责任。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • mysql复合索引和组合索引,mysql组合索引数据结构
  • mysql复合索引和组合索引,mysql组合索引数据结构,Mysql之组合索引方法详解
  • mysql复合索引和组合索引,mysql复合索引数据结构
  • mysql复合索引和组合索引,mysql复合索引数据结构,MySQL的复合索引总结
  • b+树 多路搜索树,数据结构中树的分类
  • b+树 多路搜索树,数据结构中树的分类,数据结构-树(三):多路搜索树B树、B+树
  • avl树的构造,avl树特性,数据结构之AVL树详解
  • 数据结构c语言哈夫曼树,c语言哈夫曼树的构造,使用C语言详解霍夫曼树数据结构
  • c语言数据结构算法编程库,数据结构 c语言中文网
  • c语言数据结构算法编程库,数据结构 c语言中文网,C语言编程数据结构基础详解小白篇
  • c++纸牌游戏,数据结构纸牌游戏c语言
  • c++纸牌游戏,数据结构纸牌游戏c语言,C语言实战之纸牌游戏
  • ,,c#解析jobject的数据结构
  • ,,javascript数据结构之多叉树经典操作示例【创建、添加、遍历、移除等】
  • ,,Java 数据结构与算法系列精讲之背包问题
  • 留言与评论(共有 条评论)
       
    验证码: