Java的二分搜索树
定义
二分搜索树是二叉树(不包含重复元素)。
二分搜索树的每个节点的值,大于左子树的所有节点的值,小于其右子树的所有节点的值。
每一棵子树也是二分搜索树。

二叉树搜索树必须要有比较,继承Comparable类
插入元素
package com.dsideal;
public class BST<E extends Comparable<E>> {
private class Node
{
private E e;
//左右孩子
private Node left,right;
public Node(E e)
{
this.e = e;
left = null;
right = null;
}
}
//根节点
private Node root;
//二叉树元素个数
private int size;
private BST()
{
root = null;
size = 0;
}
//二叉树有几个节点
public int size()
{
return size;
}
//二叉树是否为空
public boolean isEmpty()
{
return size == 0;
}
public void add(E e)
{
root = add(root,e);
}
//向根添加元素
private Node add(Node node,E e)
{
if(node == null)
{
size ++;
return new Node(e);
}
if (e.compareTo(node.e) < 0)
{
node.left = add(node.left,e);
}else if(e.compareTo(node.e) > 0)
{
node.right = add(node.right,e);
}
return node;
}
}
二分搜索树的前序遍历,访问该节点是在左右子树之前。
private void preOrder(Node node)
{
if (node == null)
{
return;
}
System.out.println(node.e);
preOrder(node.left);
preOrder(node.right);
}
二分搜索树的中序遍历,结果是排序的。
//二分搜索树的中序排序
public void inOrder()
{
inOrder(root);
} private void inOrder(Node node)
{
if (node == null)
{
return;
}
inOrder(node.left);
System.out.println(node.e);
inOrder(node.right);
}
二分搜索树的后序遍历
//二分搜索树的后序遍历
public void postOrder()
{
preOrder(root);
} public void postOrder(Node node)
{
if (node == null)
{
return;
}
preOrder(node.left);
preOrder(node.right);
System.out.println(node.e);
}
二分搜索树前序遍历非递归实现
public void preOrderNR()
{
Stack<Node> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty())
{
Node cur = stack.pop();
System.out.println(cur.e);
if (cur.right != null)
{
stack.push(cur.right);
}
if (cur.left != null)
{
stack.push(cur.left);
}
}
}
二分搜索树的层序遍历,最短路径
public void levelOrder()
{
Queue<Node> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty())
{
Node cur = queue.remove();
System.out.println(cur.e);
if (cur.left != null)
{
queue.add(cur.left);
}
if (cur.right != null)
{
queue.add(cur.right);
}
}
}
重写toString
@Override
public String toString()
{
StringBuffer res = new StringBuffer();
generateBSTString(root,0,res);
return res.toString();
} private void generateBSTString(Node node, int depth, StringBuffer res)
{
if (node == null)
{
res.append(generateBSTString(depth) + "null\n");
return;
}
res.append(generateBSTString(depth) + node.e + "\n");
generateBSTString(node.left,depth + 1,res);
generateBSTString(node.right,depth + 1,res);
} public String generateBSTString(int depth)
{
StringBuffer res = new StringBuffer(" ");
for (int i = 0; i < depth; i++) {
res.append("--");
}
return res.toString();
}
删除最大值和最小值
//二分数的最大值
public E maxNode()
{
if (isEmpty())
{
throw new IllegalArgumentException("BST is empty");
}
return maxNode(root).e;
} private Node maxNode(Node node)
{
if (node.right == null)
{
return node;
}
return maxNode(node.right);
}
//二分数的最小值
public E minNode()
{
if (isEmpty())
{
throw new IllegalArgumentException("BST is empty");
}
return minNode(root).e;
} private Node minNode(Node node)
{
if (root.left == null)
{
return node;
}
return minNode(node.left);
} public E removeMax()
{
E cur = maxNode();
root = removeMax(root);
return cur;
}
//删除最大值,返回根
private Node removeMax(Node node)
{
if (node.right == null)
{
Node rightNode = node.left;
node.left = null;
size --;
return rightNode;
}
node.right = removeMax(node.right);
return node;
} public E removeMin()
{
E cur = minNode();
root = removeMin(root);
return null;
} private Node removeMin(Node node)
{
if (node.left == null)
{
Node leftNode = node.right;
node.right = null;
size--;
return leftNode;
}
node.left = removeMin(node.left);
return node;
}
删除节点
//删除二分搜索树的节点
private Node remove(Node node, E e)
{
if (node == null)
{
return null;
}
if (e.compareTo(node.e) < 0)
{
node.left = remove(node.left,e);
return node;
}else if (e.compareTo(node.e) > 0)
{
node.right = remove(node.right,e);
return node;
}else{
if (node.right == null)
{
Node leftNode = node.left;
node.left = null;
size --;
return leftNode;
}
if (node.left == null)
{
Node righNode = node.right;
node.right = null;
size--;
return righNode;
} Node successor = minNode(node.right);
successor.right = removeMin(node.right);
successor.left = node.left; node.right = node.left = null;
return successor;
} }
Java的二分搜索树的更多相关文章
- java——二分搜索树 BST(递归、非递归)
~ package Date_pacage; import java.util.Stack; import java.util.ArrayList; import java.util.LinkedLi ...
- 7 二分搜索树的原理与Java源码实现
1 折半查找法 了解二叉查找树之前,先来看看折半查找法,也叫二分查找法 在一个有序的整数数组中(假如是从小到大排序的),如果查找某个元素,返回元素的索引. 如下: int[] arr = new in ...
- 二分搜索树实现Java的Map(下)
二分搜索树Map public class BSTMap<K extends Comparable<K>,V> implements Map<K,V> { priv ...
- JAVA二分搜索树
二叉树: 和链表一样,动态数据结构. 二叉树具有唯一根节点 二叉树具有天然的递归结构 二分搜索树是二叉树 二分搜索树的每个节点的值: 1.大于其左子树的所有节点的值 2.小于其右子树的所有节点的值 每 ...
- 浅析二分搜索树的数据结构的实现(Java 实现)
目录 树结构简介 二分搜索树的基础知识 二叉树的基本概念 二分搜索树的基本概念 二分搜索树的基本结构代码实现 二分搜索树的常见基本操作实现 添加操作 添加操作初步实现 添加操作改进 查询操作 遍历操作 ...
- 【LeetCode题解】530_二分搜索树的最小绝对值差
目录 [LeetCode题解]530_二分搜索树的最小绝对值差 描述 方法一.中序遍历二分搜索树 思路 Java 代码 Python 代码 [LeetCode题解]530_二分搜索树的最小绝对值差 描 ...
- 【二分搜索树】1、二分查找法的实现 - Binary Search
简单记录 - bobo老师的玩转算法系列–玩转算法 - 二分搜索树 二叉搜索树 Binary Search Tree 查找问题 Searching Problem 查找问题是计算机中非常重要的基础问题 ...
- [LeetCode] Closest Binary Search Tree Value II 最近的二分搜索树的值之二
Given a non-empty binary search tree and a target value, find k values in the BST that are closest t ...
- [LeetCode] Closest Binary Search Tree Value 最近的二分搜索树的值
Given a non-empty binary search tree and a target value, find the value in the BST that is closest t ...
随机推荐
- MassTransit 实现发布/订阅
MassTransit 介绍 先看下masstransit 官网介绍:MassTransit 是一个自由.开源.轻量级的消息总线, 用于使用. NET 框架创建分布式应用程序.MassTransit ...
- Java 读书笔记 (十六) Java 继承
例: 开发动物类,其中动物分别为企鹅以及老鼠,要求如下: 企鹅: 属性(姓名,id), 方法(吃,睡,自我介绍) 老鼠: 属性(姓名,id), 方法(吃,睡,自我介绍) 企鹅类: public cla ...
- .net core使用Apollo做统一配置管理
做开发这么多年,经常因配置的问题引发生产环境的bug.有些年久的项目,几百个密密麻麻的配置项,经常容易搞混,有时好几个项目有好多同样的配置项,配置工作也不厌其烦.所幸,携程开源了新一代配置中心 - A ...
- 【Troywar love Maths】——莫比乌斯反演
2816. Troywar loves Maths ★★☆ 输入文件:Troy_1.in 输出文件:Troy_1.out 简单对比 时间限制:1 s 内存限制:256 MB [题目描述 ...
- BZOJ_1486_[HNOI2009]最小圈_01分数规划
BZOJ_1486_[HNOI2009]最小圈_01分数规划 Description Input Output Sample Input 4 5 1 2 5 2 3 5 3 1 5 2 4 3 4 1 ...
- 关于CocoaPods的ruby镜像文件问题
项目遇到第三方库更新问题 时 用到cocoaPods更换淘宝ruby镜像问题的时候 报错 后来 又在别处找了下 发现 用的是 https 如下: 后来细想 可能跟Xcode7 要求HTTPs ...
- 我和Python的Py交易》》》》》》数据类型
Python里的变量 ---门牌 Python在使用变量之前无须定义它的类型,但是必须声明以及初始化该变量. Python中给变量赋值就是声明,初始化变量(也就是创建一个相应数据类型的对象,而那些数据 ...
- a标签跳转之前加点击事件
①在html标签中出现提示 <a href="http://www.baidu.com" onclick="if(confirm('确认百度吗?')==false) ...
- nginx安装部署(支持https)
1 安装环境准备 1.1 准备环境清单 以下是基本环境清单列表: 软件名称 版本号 说明信息 Linux CentOS 6.7 部署机器只需为Linux系统即可,无严格要求 1.2 ...
- ASP.NET Core Web API 索引 (更新Identity Server 4 视频教程)
GraphQL 使用ASP.NET Core开发GraphQL服务器 -- 预备知识(上) 使用ASP.NET Core开发GraphQL服务器 -- 预备知识(下) [视频] 使用ASP.NET C ...