二叉查找树java实现

主要参考<<数据结构与算法分析>>Java语言描述(Mark Allen Weiss)

二叉查找树主要的操作是:1.查找,2,插入,删除。

查找操作:从根节点开始,递归查找。如果值等于当前根节点,返回根节点存储的值。若果查找的值小于跟根节点的值,则查找左子树,反之递归查找右子树。如果要查找的当前节点为NULL,说明查找结束了,没有找到要查找的元素。

插入操作:基本和查找操作相同,只是最后加入找到的是null,则新建一个节点,并返回。

删除操作:找到要删除的节点,让右子树最左边的节点替代。然后删除此节点右子树最小节点。

代码如下:


public class BinarySearchTree<T extends Comparable<? super T>> {

public static void main(String[] args) {
// TODO Auto-generated method stub
BinarySearchTree<Integer> bst = new BinarySearchTree<Integer>();
Integer[] a = {2,45,43,67,8,10,12,43,65,87,432,11,90,48,40};//测试数据
for(int i = 0;i<a.length;i++){
bst.insert(a[i]);
}
bst.remove(45);
bst.remove(12);
bst.showTree();
}

private BinaryNode<T> root;
public static class BinaryNode<T>{
public T element;
public BinaryNode<T> left;
public BinaryNode<T> right;
public BinaryNode(T element, BinaryNode<T> left, BinaryNode<T> right) {
this.element = element;
this.left = left;
this.right = right;
}
public BinaryNode(T theElement) {
element = theElement;
}

}

public BinarySearchTree() {
root = null;
}

public BinarySearchTree(BinaryNode<T> root) {
this.root = root;
}

public boolean isEmpty(){
return root == null;
}

public void makeEmpty(){
root = null;
}

public boolean contains(T x){
return contains(root,x);
}
private boolean contains(BinaryNode<T> root, T x) {
if(root==null){
return false;
}
int comparaResult = x.compareTo(root.element);
if(comparaResult==1){
return true;
}
else if(comparaResult<0){
return contains(root.left,x);
}
else
return contains(root.right,x);
}
public T findMin(){
if(isEmpty()){
try {
throw new Exception();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return findMin(root).element;
}

public T findMax() throws Exception{
if(isEmpty()){
throw new Exception();
}
return findMax(root).element;
}
private BinaryNode<T> findMin(BinaryNode<T> root) {
if(root==null){
return null;
}
else if(root.left==null){
return root;
}
return findMin(root.left);
}
private BinaryNode<T> findMax(BinaryNode<T> root) {
if(root==null){
return null;
}
else if(root.right==null){
return root;
}
return findMax(root.right);
}

public void insert(T x){
root = insert(x,root);
}
public BinaryNode<T> insert(T x,BinaryNode<T> root){
if(root==null){
return new BinaryNode<T>(x, null, null);
}
int compareResult = x.compareTo(root.element);
if(compareResult>0){
root.right = insert(x,root.right);
}
else if(compareResult<0){
root.left = insert(x,root.left);
}
else
;
return root;
}
public void remove(T a){
remove(a,root);
}

private BinaryNode<T> remove(T x, BinaryNode<T> root2) {
if(root2==null){
return null;
}
int comparaResult = x.compareTo(root2.element);
if(comparaResult < 0){
root2.left = remove(x,root2.left);
}
else if(comparaResult > 0){
root2.right = remove(x,root2.right);
}
else if(root2.left!=null&&root2.right!=null){
root2.element = findMin(root2.right).element;
root2.right = remove(root2.element,root2.right);
}
else{
if(root2.left!=null){
root2 = root2.left;
}
else{
root2 = root2.right;
}
}
return root2;
}
public void showTree(){
showTree(root);
}

public void showTree(BinaryNode<T> T){
if(T==null){
return;
}
else{
showTree(T.left);
System.out.println(T.element);
showTree(T.right);
}

}
}

二叉查找树java实现

时间: 2024-10-12 11:21:39

二叉查找树java实现的相关文章

AVL树-自平衡二叉查找树(Java实现)

在计算机科学中,AVL树是最先发明的自平衡二叉查找树.AVL树得名于它的发明者 G.M. Adelson-Velsky 和 E.M. Landis,他们在 1962 年的论文 "An algorithm for the organization of information" 中发表了它. 一.AVL树的旋转规律 AVL树的基本操作一般涉及运做同在不平衡的二叉查找树所运做的同样的算法.但是要进行预先或随后做一次或多次所谓的"AVL旋转". 假设由于在二叉排序树上插入

二叉查找树--java

package com.test.tree; public class BinarySearchTree<T extends Comparable<? super T>> { /*定义二叉树的节点*/ private class BinaryNode<T>{ public T data; public BinaryNode<T> lt; public BinaryNode<T> rt; public BinaryNode(T data) { th

LeetCode96_Unique Binary Search Trees(求1到n这些节点能够组成多少种不同的二叉查找树) Java题解

题目: Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For example, Given n = 3, there are a total of 5 unique BST's. 1 3 3 2 1 \ / / / \ 3 2 1 1 3 2 / / \ 2 1 2 3 解题: 用递归的思想,当仅仅有0个或是1个节点的时候.仅仅有一种.n个节点的时候有f(n)种

LeetCode96_Unique Binary Search Trees(求1到n这些节点可以组成多少种不同的二叉查找树) Java题解

题目: Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For example, Given n = 3, there are a total of 5 unique BST's. 1 3 3 2 1 \ / / / \ 3 2 1 1 3 2 / / \ 2 1 2 3 解题: 用递归的思想,当只有0个或是1个节点的时候,只有一种:n个节点的时候有f(n)种:

数据结构—平衡二叉树

二叉排序树集中了数组的查找优势以及链表的插入.删除优势,因此在数据结构中占有一定的地位.但在一定的情况下二叉排序树又有可能变为链表,例如插入从1~100的数,这时进行数据查找的效率就要降低. 为了解决二叉排序树这种左右子树深度不均匀的情况引入了一种平衡二叉树(AVLTree):任何一个节点的左右子树深度差不超过1.通过这个限定,阻止了二叉树的左右子树深度差较大的情况,维持了二叉树的稳定. 如何让二叉树的左右子树深度差不超过1呢?这就需要对节点进行旋转,也就是当某个节点的左右子树深度超过1时需要对

java 二叉查找树

//接口+抽象类+实现类package wangChaoPA实习工作练习.com.进阶篇.二叉查找树; import java.util.Iterator;public interface Tree<E extends Comparable<E>>{    // 从树中删除e    boolean delete(E e); // 树的大小    int getSize(); // 中序遍历树    void inorder(); // 把e插入到tree中    boolean i

Java数据结构-二叉查找树续以及平衡二叉查找树

??前面一篇文章讲到了二叉查找树的实现,其中的插入操作是使用非递归方法实现的,这里再增加一种递归实现插入的操作,Java代码如下,建议增加到前一篇文章对应的FOBinarySearchTree.java中: /** * @TODO 二叉排序树插入元素(递归方法) * @param e 需要插入的元素 * @return true or false */ public boolean insert(E e){ insert(root,e); return true; } /** * @TODO 二

有效二叉查找树判断(java实现)

leetcode 原题 :(即判断二叉树是否为二叉查找树) Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as follows: The left subtree of a node contains only nodes with keys less than the node's key. The right subtree of a node

java实现二叉查找树

/** * @author zyj8170  2011-2-13 * * 此程序实现一个二叉查找树的功能,可以进行动态插入.删除关键字: * 查询给定关键字.最小关键字.最大关键字:转换为有序列表(用于排序) * * */ import java.util.ArrayList; import java.util.List; public class BinarySearchTree { // 树的根结点 private TreeNode root = null; // 遍历结点列表 privat