定义

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

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

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

二叉树搜索树必须要有比较,继承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. fixed元素随滚动条无抖动滚动

    页面上用fixed定位一个元素,随滚动条滚动位置不变,最开始我只用了css给元素身上写上fixed属性,发现滚动时元素会发生抖动,随后我就在网上找到解决办法,封装了个方法,如下: Css部分 此部分是 ...

  2. ubuntu16.04如何安装搜狗输入法

    1 . 首先我们需要先来下载支持linux版本的搜狗输入法安装包,这里我们先查看下自己的ubuntu系统是什么版本的,这里我们可以在右上角的那个齿轮图标点击查看"系统设置",在里面 ...

  3. Python集合set

    集合 set 集合是无序的 集合的值是唯一的 求两个集合的关系: list1 = [1,4,5,7,3,6,7,9] list2 = set([2,6,0,66,22,8,4]) list3 = se ...

  4. JLOI2018 划水中...

    day -3:月考成绩刚刚出炉,嗯,还看得过去,为此,我决定脱产3天...花了一天时间,学习splay day -2:在某人(汤)的刺激下,决定用半天时间A掉去年省选D2T1,事实证明,我还是图样图森 ...

  5. python书籍推荐:python编码推荐(高清完整pdf)

    目录INF-qa Python 编码规范................................................................................ ...

  6. MediatR 知多少

    引言 首先不用查字典了,词典查无此词.猜测是作者笔误将Mediator写成MediatR了.废话少说,转入正题. 先来简单了解下这个开源项目MediatR(作者Jimmy Bogard,也是开源项目A ...

  7. 事务是什么?事务的4个特点(ACID),事务的开启与结束

    事务是指作为单个逻辑工作单元执行的一组相关操作.这些操作要求全部完成 或者全部不完成.使用事务是为了保证数据的安全有效. 事务有一下四个特点:(ACID) 1.原子性(Atomic):事务中所有数据的 ...

  8. SQL优化 MySQL版 - 避免索引失效原则(二)

    避免索引失效原则(二) 注:继上一篇文章继续讲解: 避免索引失效原则(一)https://www.cnblogs.com/StanleyBlogs/p/10482048.html#4195062 作者 ...

  9. C# .NET枚举Enum项获取

    有些场景下,我们需要列举出Enum中的所有项,比如 Enum转到下拉列表给用户选择,这时我们就需要列出所有项出来了. StringBuilder sb = new StringBuilder(); / ...

  10. c# 事件的订阅发布Demo

    delegate void del(); class MyClass1 { public event del eventcount;//创建事件并发布 public void Count() { ; ...