定义

二分搜索树是二叉树(不包含重复元素)。

二分搜索树的每个节点的值,大于左子树的所有节点的值,小于其右子树的所有节点的值。

每一棵子树也是二分搜索树。

二叉树搜索树必须要有比较,继承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的二分搜索树的更多相关文章

  1. java——二分搜索树 BST(递归、非递归)

    ~ package Date_pacage; import java.util.Stack; import java.util.ArrayList; import java.util.LinkedLi ...

  2. 7 二分搜索树的原理与Java源码实现

    1 折半查找法 了解二叉查找树之前,先来看看折半查找法,也叫二分查找法 在一个有序的整数数组中(假如是从小到大排序的),如果查找某个元素,返回元素的索引. 如下: int[] arr = new in ...

  3. 二分搜索树实现Java的Map(下)

    二分搜索树Map public class BSTMap<K extends Comparable<K>,V> implements Map<K,V> { priv ...

  4. JAVA二分搜索树

    二叉树: 和链表一样,动态数据结构. 二叉树具有唯一根节点 二叉树具有天然的递归结构 二分搜索树是二叉树 二分搜索树的每个节点的值: 1.大于其左子树的所有节点的值 2.小于其右子树的所有节点的值 每 ...

  5. 浅析二分搜索树的数据结构的实现(Java 实现)

    目录 树结构简介 二分搜索树的基础知识 二叉树的基本概念 二分搜索树的基本概念 二分搜索树的基本结构代码实现 二分搜索树的常见基本操作实现 添加操作 添加操作初步实现 添加操作改进 查询操作 遍历操作 ...

  6. 【LeetCode题解】530_二分搜索树的最小绝对值差

    目录 [LeetCode题解]530_二分搜索树的最小绝对值差 描述 方法一.中序遍历二分搜索树 思路 Java 代码 Python 代码 [LeetCode题解]530_二分搜索树的最小绝对值差 描 ...

  7. 【二分搜索树】1、二分查找法的实现 - Binary Search

    简单记录 - bobo老师的玩转算法系列–玩转算法 - 二分搜索树 二叉搜索树 Binary Search Tree 查找问题 Searching Problem 查找问题是计算机中非常重要的基础问题 ...

  8. [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 ...

  9. [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 ...

随机推荐

  1. java基础学习周计划之3--每周一练

    每周一练第一周 一. 关键代码:1.斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...数列第一项和第二项是1, 从第三项开始, ...

  2. go源文件中是否有main函数

    import (    "go/parser" "go/token"    "go/ast"  )  func HasMain(file s ...

  3. bzoj 2821 作诗 分块

    基本思路和蒲公英一样 还是预处理出每两个块间的答案 询问时暴力跑两边的贡献 #include<cstdio> #include<cstring> #include<ios ...

  4. shell脚本中cd命令无效

    对于一段包含cd 命令的shell脚本(test.sh): #!/bin/bash cd .. mkdir ./test 运行: sh ./test.sh 脚本运行时无法在上级目录建立test文件 此 ...

  5. javascript正则表达式学习(二)--位置匹配

    文章首发于sau交流学习社区 一.前言 正则表达式是匹配模式,要么是匹配字符,要么匹配位置. 其实在开发中很少用到匹配位置,本篇文章主要包含: 二.什么是位置 位置:相邻字符之间的位置. 三.如何匹配 ...

  6. javascript引擎执行的过程的理解--语法分析和预编译阶段

    一.概述 js是一种非常灵活的语言,理解js引擎的执行过程对于我们学习js是非常有必要的.看了很多这方便文章,大多数是讲的是事件循环(event loop)或者变量提升的等,并没有全面分析其中的过程. ...

  7. Git版本控制 —— IDE工具(IDEA)

    本文介绍使用IDEA控制Git操作 关联本地Git客户端 首先要根据系统环境安装Git客户端 然后使用File --> Settings -->  Version Control --&g ...

  8. 我是如何将博客转成PDF的

    前言 只有光头才能变强 之前有读者问过我:"3y你的博客有没有电子版的呀?我想要份电子版的".我说:"没有啊,我没有弄过电子版的,我这边有个文章导航页面,你可以去文章导航 ...

  9. SpringBoot当中如何整合mybatis和注入

    [学习笔记] 6.整合mybatis和注入: 马克-to-win@马克java社区: 根据第3部分的helloworld例子,用那个项目做底子.pom.xml只需要加入mybatis和mysql的部分 ...

  10. Dynamics Business Central-如何配置VS Code连接BC环境

    最近在研究Business Central,也就是以前的Dynamics NAV,需要配置Visual Studio Code连接BC环境,以下是配置的具体步骤. 1. VS Code下载,这个不多说 ...