Java 二叉搜索树 实现和学习
/**
* <html>
* <body>
* <P> Copyright 1994 JsonInternational</p>
* <p> All rights reserved. - https://github.com/Jasonandy/Java-Core-Advanced </p>
* <p> Created by Jason</p>
* </body>
* </html>
*/
package cn.ucaner.datastructure.BinarySearchTree; /**
* @Package:cn.ucaner.datastructure.BinarySearchTree
* @ClassName:BinarySearchTree
* @Description: <p> 树集合了数组(查找速度快)和链表(插入、删除速度快)的优点 </br> CSDN {@link https://blog.csdn.net/a19881029/article/details/24379339} </p>
* 二叉树是一种特殊的树,即:树中的每个节点最多只能有两个子节点
* 二叉搜索树是一种特殊的二叉树,即:节点的左子节点的值都小于这个节点的值,节点的右子节点的值都大于等于这个节点的值
* Tips:如果树中允许存在重复数据,处理起来比较麻烦,故实现中不允许树中存在重复数据,即节点的右子节点的值必须大于节点的值.
* 搜索二叉树有一个特点,即如果使用中序遍历遍历搜索二叉树,将得到包含搜索二叉树中所有节点值的升序排序结果
* @Author: - Jason
* @CreatTime:2018年4月7日 下午8:37:11
* @Modify By:
* @ModifyTime: 2018年4月7日
* @Modify marker:
* @version V1.0
*/
public class BinarySearchTree { private TreeNode root;//定义树的根结点 /**
* BinarySearchTree. 根据已知序列构建二叉搜索树
* @param input
*/
public BinarySearchTree(int[] input) {
createBinarySearchTree(input);
} /**
* @Description: 根据已知序列构建二叉搜索树
* @param input void
* @Autor:Jason - jasonandy@hotmail.com
*/
public void createBinarySearchTree(int[] input) {
if (input != null) {
for (int i = 0; i < input.length; i++) {
root = insert(input[i], root);
}
}
} /**
* @Description: 二叉搜索树的搜索算法,递归算法
* @param target 目标值
* @param root 二叉搜索树的根结点
* @return TreeNode
* @Autor: Jason - jasonandy@hotmail.com
*/
public TreeNode search(int target, TreeNode root) {
TreeNode result = null;
if (root != null) { // 递归终止条件
if (target == root.data) { // 递归终止条件
result = root;
return result;
} else if (target < root.data) { // 目标值小于根结点值,从左子树查找
result = search(target, root.left);
} else { // 目标值大于根结点值,从右子树查找
result = search(target, root.right);
}
}
return result;
} /**
* @Description: 二叉搜索树的插入操作
* @param target
* @param node
* @return TreeNode
* @Autor: Jason - jasonandy@hotmail.com
*/
public TreeNode insert(int target, TreeNode node) {
if (search(target, node) == null) {
if (node == null) {
return new TreeNode(target);
} else {
if (target < node.data) {
node.left = insert(target, node.left);
} else {
node.right = insert(target, node.right);
}
}
}
return node;
} /**
* @Description: 删除搜索二叉树的制定结点
* @param target
* @param node
* @return TreeNode
* @Autor: jason - jasonandy@hotmail.com
*/
public TreeNode remove(int target, TreeNode node) {
TreeNode tmp = null;
if (node != null) {
if (target < node.data) { // 从左子树删除
node.left = remove(target, node.left);
} else if (target > node.data) { // 从右子树删除
node.right = remove(target, node.right);
} else if (node.left != null && node.right != null) { // 找到待删除结点,且其左右子树不为空
// 找到以待删除结点右子树的中序遍历第一个结点(最小结点)
tmp = node.right;
while (tmp.left != null) {
tmp = tmp.left;
} // 用最小结点补位待删除结点
node.data = tmp.data; // 删除待删除结点右子树上补位结点
node.right = remove(node.data, node.right);
} else {
if (node.left == null) {
node = node.right;
} else {
node = node.left;
}
}
}
return node;
} /**
* @Description: 中序遍历二叉搜索树,递归算法,升序排序
* @param node void
* @Autor: Jason - jasonandy@hotmail.com
*/
public void inOrder(TreeNode node) {
if (node != null) {
inOrder(node.left);
System.out.print(root.data + " ");
inOrder(node.right);
}
} /**
* @Description: 打印二叉搜索树
* @param node void
* @Autor:jason - jasonandy@hotmail.com
*/
public void printTree(TreeNode node) {
if (node != null) {
System.out.print(node.data);
if (node.left != null || node.right != null) {
System.out.print("(");
printTree(node.left);
System.out.print(",");
printTree(node.right);
System.out.print(")");
}
}
} /**
* @Description: 访问二叉搜索树的根结点
* @return TreeNode
* @Autor:Jason - jasonandy@hotmail.com
*/
public TreeNode getRoot() {
return root;
}
}
/**
* <html>
* <body>
* <P> Copyright 1994 JsonInternational</p>
* <p> All rights reserved. - https://github.com/Jasonandy/Java-Core-Advanced </p>
* <p> Created by Jason</p>
* </body>
* </html>
*/
package cn.ucaner.datastructure.BinarySearchTree; /**
* @Package:cn.ucaner.datastructure.BinarySearchTree
* @ClassName:TreeNode
* @Description: <p> Node节点</p>
* @Author: - Jason
* @CreatTime:2018年4月7日 下午8:41:02
* @Modify By:
* @ModifyTime: 2018年4月7日
* @Modify marker:
* @version V1.0
*/
public class TreeNode { /**
*结点的数据项
*/
public int data; /**
* 结点指向左孩子的引用
*/
public TreeNode left; /**
* 结点指向右孩子的引用
*/
public TreeNode right; /**
* TreeNode. 构造方法,初始化结点数据项
* @param data
*/
public TreeNode(int data){
this.data = data;
} @Override
public String toString() {
return "TreeNode [data=" + data + "]";
} }
Java 二叉搜索树 实现和学习的更多相关文章
- java二叉搜索树原理与实现
计算机里面的数据结构 树 在计算机存储领域应用作用非常大,我之前也多次强调多磁盘的存取速度是目前计算机飞速发展的一大障碍,计算机革命性的的下一次飞跃就是看硬盘有没有质的飞跃,为什么这么说?因为磁盘是永 ...
- Java二叉搜索树实现
树集合了数组(查找速度快)和链表(插入.删除速度快)的优点 二叉树是一种特殊的树,即:树中的每个节点最多只能有两个子节点 二叉搜索树是一种特殊的二叉树,即:节点的左子节点的值都小于这个节点的值,节点的 ...
- java 二叉搜索树
java二叉查找树实现: 二叉查找树,上图:比根节点小者在其左边,比根节点大者在其右边. 抽象数据结构,上代码: /** * 二叉查找树数据结构(非线程安全): * 范型类型须实现Comparable ...
- 二叉搜索树Java实现(查找、插入、删除、遍历)
由于最近想要阅读下 JDK1.8 中 HashMap 的具体实现,但是由于 HashMap 的实现中用到了红黑树,所以我觉得有必要先复习下红黑树的相关知识,所以写下这篇随笔备忘,有不对的地方请指出- ...
- Java实现二叉搜索树
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11406176.html 尝试一下用Java实现二叉搜索树/二叉查找树,记录自己的学习历程. 1 ...
- 【算法与数据结构】二叉搜索树的Java实现
为了更加深入了解二叉搜索树,博主自己用Java写了个二叉搜索树,有兴趣的同学可以一起探讨探讨. 首先,二叉搜索树是啥?它有什么用呢? 二叉搜索树, 也称二叉排序树,它的每个节点的数据结构为1个父节点指 ...
- Java实现二叉搜索树的添加,前序、后序、中序及层序遍历,求树的节点数,求树的最大值、最小值,查找等操作
什么也不说了,直接上代码. 首先是节点类,大家都懂得 /** * 二叉树的节点类 * * @author HeYufan * * @param <T> */ class Node<T ...
- Java与算法之(13) - 二叉搜索树
查找是指在一批记录中找出满足指定条件的某一记录的过程,例如在数组{ 8, 4, 12, 2, 6, 10, 14, 1, 3, 5, 7, 9, 11, 13, 15 }中查找数字15,实现代码很简单 ...
- 二叉搜索树(Java实现)
二叉搜索树基本操作 求树中的结点个数 判断节点是否为空 向树中插入新结点key-value 树中是否存在key 返回树中key对应的value值 先序遍历 中序遍历 后续遍历 层序遍历 求树中key最 ...
随机推荐
- C博客作业02—循环结构
0.展示PTA总分(0----2) 截图展示2次题目集:单循环和嵌套循环题目集,排名分数截图. 1.本章学习总结(2分) 1.1 学习内容总结 整理这两周学习主要知识点,并能对每个知识点介绍简单案例或 ...
- 转载:SVD
ComputeSVD 在分布式矩阵有CoordinateMatirx, RowMatrix, IndexedRowMatrix三种.除了CoordinateMatrix之外,Indexe ...
- 【AtCoder】 ARC 103
link C-//// 直接算会出现奇偶两组选了同一个数,注意处理一下就行 #include<bits/stdc++.h> #define ll long long #define dbg ...
- zipkin exec下载地址
zipkin exec下载地址 https://repo1.maven.org/maven2/io/zipkin/java/zipkin-server/1.20.1/zipkin-server-1.2 ...
- CSS MDN - 选择器与样式化文字
- typescript - 9.装饰器
装饰器:装饰器是一种特殊类型的声明,它能够被附加到类声明,方法,属性或参数上,可以修改类的行为. 通俗的讲装饰器就是一个方法,可以注入到类.方法.属性参数上来扩展类.属性.方法.参数的功能. 常见的装 ...
- UBI mkfs.ubifs 参数记录
NAND 硬件结构如下: 脚本如下 sudo mkfs.ubifs -q -r rootfs_iproute -m 4096 -e 248KiB -c 3840 -o ubifs.img -F ech ...
- 一篇文章学会shell脚本
一.Shell传递参数 #!/bin/bash # 假设在脚本运行时写了三个参数 ..,,则 "(传递了三个参数). echo "-- \$* 演示 --" for i ...
- python之psutil模块
简述 psutil是一个跨平台库(http://code.google.com/p/psutil/) ,能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息.它主要应用于系 ...
- Spring MVC -- 表达式于语言(EL)
JSP 2.0最重要的特性之一就是表达式语言(EL),JSP用户可以用它来访问应用程序数据.由于受到ECMAScript和XPath表达式语言的启发,EL也设计成可以轻松地编写免脚本(就是不用在jsp ...