转:http://blog.csdn.net/a19881029/article/details/24379339

实现代码:

 Node.java
 //节点类
public class Node{
int data;
Node left;
Node right;
public Node(int data){
this.data = data;
left = null;
right = null;
}
}
 
 BinarySearchTree.java
 
 public class BinarySearchTree {
//声明
public static  Node root;
public BinarySearchTree(){
this.root = null;
}
//Nod对象current为空=root
public boolean find(int id){
Node current = root;
while(current!=null){
if(current.data==id){
return true;
}else if(current.data>id){
current = current.left;
}else{
current = current.right;
}
}
return false;
}
//
public boolean delete(int id){
if(root == null)
return false;
else{
Node parent = root;
Node current = root;
boolean isLeftChild = false;
while(current.data!=id){
parent = current;
if(current.data>id){
isLeftChild = true;
current = current.left;
}else{
isLeftChild = false;
current = current.right;
}
if(current ==null){
return false;
}
}
//if i am here that means we have found the node
//Case 1: if node to be deleted has no children
if(current.left==null && current.right==null){
if(current==root){
root = null;
}
if(isLeftChild ==true){
parent.left = null;
}else{
parent.right = null;
}
}
//Case 2 : if node to be deleted has only one child
else if(current.right==null){
if(current==root){
root = current.left;
}else if(isLeftChild){
parent.left = current.left;
}else{
parent.right = current.left;
}
}
else if(current.left==null){
if(current==root){
root = current.right;
}else if(isLeftChild){
parent.left = current.right;
}else{
parent.right = current.right;
}
}else if(current.left!=null && current.right!=null){

//now we have found the minimum element in the right sub tree
Node successor  = getSuccessor(current);
if(current==root){
root = successor;
}else if(isLeftChild){
parent.left = successor;
}else{
parent.right = successor;
}
successor.left = current.left;
}
return true;
}
}
//
public Node getSuccessor(Node deleleNode){
Node successsor =null;
Node successsorParent =null;
//200,300,400
Node current = deleleNode.right;
while(current!=null){
successsorParent = successsor;
successsor = current;
current = current.left;
}
//check if successor has the right child, it cannot have left child for sure
// if it does have the right child, add it to the left of successorParent.
// successsorParent
if(successsor!=deleleNode.right){
successsorParent.left = successsor.right;
successsor.right = deleleNode.right;
}
return successsor;
}
//插入节点
public void insert(int id){
Node newNode = new Node(id);
if(root==null){
root = newNode;
return;
}
//current=100,200,300
Node current = root;
Node parent = null;
while(true){
parent = current;
if(id<current.data){
current = current.left;
if(current==null){
parent.left = newNode;
return;
}
}else{
current = current.right;
if(current==null){
parent.right = newNode;
return;
}
}
}
}

public void display(Node root, StringBuilder sb){
if(root!=null){
display(root.left, sb);
sb.append(" " + root.data);
display(root.right, sb);
}
}

public String inorderTraverse(Node root){
StringBuilder sb = new StringBuilder(); 
this.display(root, sb);
return sb.toString();
}
}

本人做的测试代码:
BranchSearchTreeTest1.java:

import static org.junit.Assert.*;

import org.junit.Test;

public class BinarySearchTreeTest1 {

BinarySearchTree bs1;
BinarySearchTree bs2;
BinarySearchTree bs3;
BinarySearchTree bs4;

@Test
public void testBinarySearchTree() {
}

@Test
public void testFind() {
bs1=new BinarySearchTree();
bs1.root=new Node(20);
bs1.root.left=new Node(10);
bs1.root.right=new Node(30);

//查找成功
assertTrue(bs1.find(20));
assertTrue(bs1.find(10));
assertTrue(bs1.find(30));
//查找失败
assertFalse(bs1.find(40));
}

@Test
public void testDelete() {
//root=null
bs1=new BinarySearchTree();
bs1.root=null;
assertFalse(bs1.delete(10));

//root!=null
bs2=new BinarySearchTree();
bs2.root=new Node(200);
bs2.root.left=new Node(100);
bs2.root.right=new Node(300);

assertTrue(bs2.delete(200));
assertFalse(bs2.delete(90));
assertFalse(bs2.delete(320));
assertTrue(bs2.delete(100));
assertTrue(bs2.delete(300));
}

@Test
public void testGetSuccessor() {
bs1=new BinarySearchTree();
Node n1=new Node(200);
n1.left=new Node(100);
n1.right=new Node(300);
n1.left.left=new Node(10);
n1.left.right=new Node(100);
n1.right.left=new Node(200);
n1.right.right=new Node(400);
assertEquals(200,bs1.getSuccessor(n1));

// bs2=new BinarySearchTree();
// Node n2=new Node(200);
// n2.left=new Node(100);
// n2.right=new Node(300);
// assertEquals(null,bs1.getSuccessor(n2));
}

@Test
public void testInsert() {
bs1=new BinarySearchTree();
//root=null,则newNode=root=10=current,parant=null
bs1.insert(10);

bs2=new BinarySearchTree();
bs2.root=new Node(200);
bs2.root.left=new Node(100);
bs2.root.right=new Node(300);
bs2.insert(100);
bs2.insert(300);

bs3=new BinarySearchTree();
bs3.root=new Node(200);
// bs3.root.left=new Node(100);
bs3.root.right=new Node(300);
bs3.insert(100);

// bs4=new BinarySearchTree();
// bs4.root=new Node(2000);
// bs4.root.left=new Node(1000);
//// bs4.root.right=new Node(300);
// bs4.insert(30000);
}

@Test
public void testDisplay() {
bs1=new BinarySearchTree();
bs1.display(bs1.root, null);

bs2=new BinarySearchTree();
bs2.root=new Node(20);
bs2.display(bs2.root, new StringBuilder());
}

@Test
public void testInorderTraverse() {
bs1=new BinarySearchTree();
bs1.inorderTraverse(null);

bs2=new BinarySearchTree();
bs2.root=new Node(20);
bs2.inorderTraverse(bs2.root);

}

}

测试结果:

二叉搜索树(Binary Search Tree)实现及测试的更多相关文章

  1. 编程算法 - 二叉搜索树(binary search tree) 代码(C)

    二叉搜索树(binary search tree) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 二叉搜索树(binary search tree)能 ...

  2. 数据结构 《5》----二叉搜索树 ( Binary Search Tree )

    二叉树的一个重要应用就是查找. 二叉搜索树 满足如下的性质: 左子树的关键字 < 节点的关键字 < 右子树的关键字 1. Find(x) 有了上述的性质后,我们就可以像二分查找那样查找给定 ...

  3. [Data Structure] 二叉搜索树(Binary Search Tree) - 笔记

    1. 二叉搜索树,可以用作字典,或者优先队列. 2. 根节点 root 是树结构里面唯一一个其父节点为空的节点. 3. 二叉树搜索树的属性: 假设 x 是二叉搜索树的一个节点.如果 y 是 x 左子树 ...

  4. 二叉搜索树(Binary Search Tree)(Java实现)

    @ 目录 1.二叉搜索树 1.1. 基本概念 1.2.树的节点(BinaryNode) 1.3.构造器和成员变量 1.3.公共方法(public method) 1.4.比较函数 1.5.contai ...

  5. 二叉搜索树 (BST) 的创建以及遍历

    二叉搜索树(Binary Search Tree) : 属于二叉树,其中每个节点都含有一个可以比较的键(如需要可以在键上关联值), 且每个节点的键都大于其左子树中的任意节点而小于右子树的任意节点的键. ...

  6. [LeetCode] Split BST 分割二叉搜索树

    Given a Binary Search Tree (BST) with root node root, and a target value V, split the tree into two ...

  7. 自己动手实现java数据结构(六)二叉搜索树

    1.二叉搜索树介绍 前面我们已经介绍过了向量和链表.有序向量可以以二分查找的方式高效的查找特定元素,而缺点是插入删除的效率较低(需要整体移动内部元素):链表的优点在于插入,删除元素时效率较高,但由于不 ...

  8. BinarySearchTree二叉搜索树的实现

    /* 二叉搜索树(Binary Search Tree),(又:二叉查找树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; ...

  9. 二叉搜索树(BST)---python实现

    github:代码实现 本文算法均使用python3实现 1. 二叉搜索树定义   二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree).   二叉搜 ...

随机推荐

  1. maven更换源

    1)在 /etc/maven/settings.xml 找到  <mirrors>  </ mirrors>标签,在标签内部 添加内容如下: <mirror>    ...

  2. 在MongoDB中实现聚合函数

    在MongoDB中实现聚合函数 随着组织产生的数据爆炸性增长,从GB到TB,从TB到PB,传统的数据库已经无法通过垂直扩展来管理如此之大数据.传统方法存储和处理数据的成本将会随着数据量增长而显著增加. ...

  3. vscode中PyLint报错Unable to import解决方案

    在导入其它文件夹中py文件的时候,即使在代码中添加了指定路径,由于Pylint 无法检测到该文件,会给出Unable to import 'xxx'的错误提示 需要在项目目录下添加.pylintrc文 ...

  4. Redis 缓存服务配置与使用

    缓存服务器Couchbase另外一种选择Redis documentation http://redis.io/documentation http://redis.cn/documentation. ...

  5. 使用binlog2sql针对mysql进行数据恢复

    MySQL闪回原理与实战 DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚.传统恢复方法是利用备份重搭实例,再应用去除错误sql后的binlog来恢复数据.此法 ...

  6. 全网最详细的Sublime Text 3的插件官方网站(图文详解)

    不多说,直接上干货! 全网最详细的Windows里下载与安装Sublime Text *(图文详解) 全网最详细的Sublime Text 3的激活(图文详解) 全网最详细的Sublime Text ...

  7. 全网最详细的大数据集群环境下多个不同版本的Cloudera Hue之间的界面对比(图文详解)

    不多说,直接上干货! 为什么要写这么一篇博文呢? 是因为啊,对于Hue不同版本之间,其实,差异还是相对来说有点大的,具体,大家在使用的时候亲身体会就知道了,比如一些提示和界面. 安装Hue后的一些功能 ...

  8. php -- 格式化字符串

    ----- 003-output.php ----- <!DOCTYPE html> <html> <head> <meta http-equiv=" ...

  9. Linux信号和trap命令的使用

    目录 信号介绍 信号列表 控制信号 Ctrl+c显示指定内容 使Ctrl+c无任何操作 处理多个信号 处理所有信号 恢复信号 实现跳板机(实例) 信号介绍 运行Shell脚本时,如果按下快捷键Ctrl ...

  10. mysql关于timestamp字段相关内容

    发现5.6和5.7版本的创建表不一致,从5.6导出数据表创建sql文件,然后导入到5.7表会报错,timestamp不能为空 查看的sql_mode mysql5.0以上支持的三种模式 1. ANSI ...