java数据结构和算法------二叉排序树

  1 package iYou.neugle.search;
  2
  3 public class BSTree_search {
  4     class BSTree {
  5         public int data;
  6         public BSTree left;
  7         public BSTree right;
  8     }
  9
 10     public static void main(String[] args) {
 11         BSTree_search bst = new BSTree_search();
 12         int[] array = new int[] { 50, 30, 70, 10, 40, 90, 80 };
 13         BSTree bsTree = bst.CreateBSTree(array);
 14
 15         bst.LDR_BST(bsTree);
 16
 17         boolean bool = bst.SearchBSTree(bsTree, 10);
 18         System.out.println("10是否在二叉排序树中:" + bool);
 19
 20         BSTree adjustBSTree = bst.DeleteBSTree(bsTree, 50);
 21         bst.LDR_BST(adjustBSTree);
 22     }
 23
 24     // 创建二叉排序树
 25     public BSTree CreateBSTree(int[] array) {
 26         BSTree bsTree = null;
 27         for (int i = 0; i < array.length; i++) {
 28             if (bsTree == null) {
 29                 bsTree = new BSTree();
 30                 bsTree.data = array[i];
 31             } else {
 32                 this.InsertBSTree(bsTree, array[i]);
 33             }
 34         }
 35         return bsTree;
 36     }
 37
 38     // 递归创建左右子树
 39     public void InsertBSTree(BSTree bsTree, int key) {
 40         if (bsTree.data > key) {
 41             if (bsTree.left == null) {
 42                 bsTree.left = new BSTree();
 43                 bsTree.left.data = key;
 44             } else {
 45                 InsertBSTree(bsTree.left, key);
 46             }
 47         } else {
 48             if (bsTree.right == null) {
 49                 bsTree.right = new BSTree();
 50                 bsTree.right.data = key;
 51             } else {
 52                 InsertBSTree(bsTree.right, key);
 53             }
 54         }
 55     }
 56
 57     // 中序遍历(递归)
 58     public void LDR_BST(BSTree bsTree) {
 59         if (bsTree != null) {
 60             LDR_BST(bsTree.left);
 61             System.out.println(bsTree.data);
 62             LDR_BST(bsTree.right);
 63         }
 64     }
 65
 66     // 在二叉排序树中查找元素是否存在
 67     public boolean SearchBSTree(BSTree bsTree, int key) {
 68         if (bsTree == null) {
 69             return false;
 70         }
 71         if (bsTree.data == key) {
 72             return true;
 73         }
 74         if (bsTree.data > key) {
 75             return SearchBSTree(bsTree.left, key);
 76         } else {
 77             return SearchBSTree(bsTree.right, key);
 78         }
 79     }
 80
 81     // 删除二叉排序树中的节点
 82     public BSTree DeleteBSTree(BSTree bsTree, int key) {
 83         if (bsTree == null) {
 84             return null;
 85         }
 86
 87         if (bsTree.data == key) {
 88             // 第一种情况:叶子节点
 89             if (bsTree.left == null && bsTree.right == null) {
 90                 bsTree = null;
 91             }
 92             // 第二种情况:节点有左子结点
 93             if (bsTree.left != null && bsTree.right == null) {
 94                 bsTree = bsTree.left;
 95             }
 96             // 第三种情况:节点有右子结点
 97             if (bsTree.left == null && bsTree.right != null) {
 98                 bsTree = bsTree.right;
 99             }
100             // 第四种情况:节点既有左子结点又有右子结点
101             if (bsTree.left != null && bsTree.right != null) {
102                 BSTree temp = bsTree.right;
103                 // 查找到右边节点中最左侧的节点
104                 while (temp.left != null) {
105                     temp = temp.left;
106                 }
107                 // 将左边节点赋给右边节点中最左侧的节点
108                 temp.left = bsTree.left;
109
110                 bsTree = bsTree.right;
111             }
112
113             return bsTree;
114         }
115
116         if (bsTree.data > key) {
117             bsTree.left = DeleteBSTree(bsTree.left, key);
118         } else {
119             bsTree.right = DeleteBSTree(bsTree.right, key);
120         }
121
122         return bsTree;
123     }
124 }
时间: 2024-10-22 16:25:55

java数据结构和算法------二叉排序树的相关文章

Java数据结构和算法(一)树

Java数据结构和算法(一)树 前面讲到的链表.栈和队列都是一对一的线性结构,这节讲一对多的线性结构 - 树.「一对多」就是指一个元素只能有一个前驱,但可以有多个后继. 一.树 度(Degree) :节点拥有的子树数.树的度是树中各个节点度的最大值. 节点 :度为 0 的节点称为叶节点(Leaf)或终端节点.度不为 0 的节点称为分支节点.除根节点外,分支节点也被称为内部节点. 节点关系 :节点的子树的根称为该节点的孩子(Child).该结点称为孩子的双亲或父结点.同一个双亲的孩子之间互称为兄弟

Java数据结构和算法之递归

四.递归 递归是函数调用自身的一种特殊的编程技术,其应用主要在以下几个方面:   阶乘 在java当中的基本形式是: Public  void  mothed(int n){//当满足某条件时: Mothed(n‐1): } 递归二分查找 Java二分查找实现,欢迎大家提出交流意见.  /** *名称:BinarySearch *功能:实现了折半查找(二分查找)的递归和非递归算法. *说明: *     1.要求所查找的数组已有序,并且其中元素已实现Comparable<T>接口,如Integ

Java数据结构和算法(二)——数组

数组的用处是什么呢?--当你需要将30个数进行大小排列的时候,用数组这样的数据结构存储是个很好的选择,当你是一个班的班主任的时候,每次要记录那些学生的缺勤次数的时候,数组也是很有用.数组可以进行插入,删除,查找等. 1)创建和内存分配 Java中有两种数据类型,基本类型和对象类型,也有人称为引用类型,Java中把数组当成对象,创建数组时使用new操作符. int array[] = new int[10]; 既然是对象,那么array便是数组的一个引用,根据Java编程思想(一) -- 一切都是

Java数据结构与算法之集合

线性表.链表.哈希表是常用的数据结构,在进行Java开发时,SDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中. 一.Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object.一些Collection允许相同元素而另一些不行.一些能排序而另一些不行.Java  SDK不提供直接继承自Collection的类,Java  SDK提供的类都是继承自Collection的"子接口"如List和Set

Java数据结构和算法之栈与队列

二.栈与队列 1.栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底(Bottom). (2)当表中没有元素时称为空栈. (3)栈为后进先出(Last In First Out)的线性表,简称为LIFO表. 栈的修改是按后进先出的原则进行. 每次删除(退栈)的总是当前栈中"最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除. 图1 [示例]元素是以a1,a2,-,a

Java数据结构和算法之数组与简单排序

一.数组于简单排序 数组 数组(array)是相同类型变量的集合,可以使用共同的名字引用它.数组可被定义为任何类型,可以是一维或多维.数组中的一个特别要素是通过下标来访问它.数组提供了一种将有联系的信息分组的便利方法. 一维数组 一维数组(one‐dimensional array )实质上是相同类型变量列表.要创建一个数组,你必须首先定义数组变量所需的类型.通用的一维数组的声明格式是: type var‐name[ ]; 获得一个数组需要2步: 第一步,你必须定义变量所需的类型. 第二步,你必

Java数据结构和算法之链表

三.链表 链结点 在链表中,每个数据项都被包含在'点"中,一个点是某个类的对象,这个类可认叫做LINK.因为一个链表中有许多类似的链结点,所以有必要用一个不同于链表的类来表达链结点.每个LINK对象中都包含一个对下一个点引用的字段(通常叫做next)但是本身的对象中有一个字段指向对第一个链结点的引用. 单链表 用一组地址任意的存储单元存放线性表中的数据元素. 以元素(数据元素的映象)  + 指针(指示后继元素存储位置)  = 结点(表示数据元素 或 数据元素的映象) 以"结点的序列&q

Java数据结构和算法之哈希表

五.哈希表 一般的线性表.树中,记录在结构中的相对位置是随机的即和记录的关键字之间不存在确定的关系,在结构中查找记录时需进行一系列和关键字的比较.这一类查找方法建立在"比较"的基础上,查找的效率与比较次数密切相关.理想的情况是能直接找到需要的记录,因此必须在记录的存储位置和它的关键字之间建立一确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应.因而查找时,只需根据这个对应关系f找到给定值K的像f(K).若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上,由此不需

java数据结构与算法之顺序表与链表深入分析

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52953190 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 ??数据结构与算法这门学科虽然在大学期间就已学习过了,但是到现在确实也忘了不少,因此最近又重新看了本书-<数据结构与算法分析>加上之前看的<java数据结构>也算是对数据结构的进一步深入学习了,于是也就打算