二叉查找树--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) {
            this(data, null, null);
        }
        public BinaryNode(T data, BinaryNode<T> lt, BinaryNode<T> rt) {
            this.data = data;
            this.lt = lt;
            this.rt = rt;
        }
    }

    private BinaryNode<T> root; //定义二叉查找树的根节点

    public BinarySearchTree(){ //初始化二叉查找树
        root = null;
    }

    public void makeEmpty(){ //树清空
        root = null;
    }

    public boolean isEmpty(){ //树判空
        return root == null;
    }

    public boolean contains(T x){ //判断是否包含某个值
        return contains(root, x);
    }
    public boolean contains(BinaryNode<T> root, T x){
        if(root == null){
            return false;
        }
        int compare = x.compareTo(root.data);
        if(compare == 0){
            return true;
        }else if(compare < 0){
            contains(root.lt, x);
        }else {
            contains(root.rt, x);
        }
        return false;
    }

    public T findMin(){ //获得树中最小值
        if(!isEmpty()){
            return findMin(root).data;
        }
        return null;
    }
    public T findMax(){ //获得树中最大值
        if(!isEmpty()){
            return findMax(root).data;
        }
        return null;
    }

    public void insert(T data){ //插入数据
        root = insert(data, root);
    }

    public void remove(T data){
        root = remove(data, root);
    }

    public void printTree(){
        if(root == null){
            System.out.println("empty tree");
        }else{
            printTree(root);
        }
    }
    /*中序遍历*/
    public void printTree(BinaryNode<T> t){
        if(t != null){
            printTree(t.lt);
            System.out.print(t.data+"、");
            printTree(t.rt);
        }
    }
    /**
     * 删除查找树的某个节点,首先用要删除节点的右子树中最小值替换节点值,
     * 再从右子树中删除此节点,递归调用
     * */
    public BinaryNode<T> remove(T data, BinaryNode<T> t){
        if(t == null){
            return t;
        }
        int compare = data.compareTo(t.data);

        if(compare < 0){
            //插入值比根节点的值小,插入到左字数
            t.lt = remove(data, t.lt);
        }else if(compare > 0){
            //插入值比根节点的值小,插入到左字数
            t.rt = remove(data, t.rt);
        }else if(t.lt != null && t.rt != null){
            t.data = findMin(t.rt).data; //将右子树中的最小值赋给要删除的节点
            t.rt = remove(t.data, t.rt);
        }else{
            t = t.lt == null? t.rt:t.lt;
        }
        return t;
    }
    public BinaryNode<T> insert(T data, BinaryNode<T> t){
        if(t == null){
            return new BinaryNode<T>(data, null, null);
        }
        int compare = data.compareTo(t.data);
        if(compare < 0){
            //插入值比根节点的值小,插入到左字数
            t.lt = insert(data, t.lt);
        }else if(compare > 0){
            //插入值比根节点的值小,插入到左字数
            t.rt = insert(data, t.rt);
        }else{
        }
        return t;
    }
    public BinaryNode<T> findMin(BinaryNode<T> t){
        if(t == null){
            return t;
        }else if(t.lt == null){ //查找树的左边比节点值小,找到最左边的节点即可
            return t;
        }else{
            return findMin(t.lt);
        }
    }

    public BinaryNode<T> findMax(BinaryNode<T> t){
        if(t == null){
            return null;
        }else if(t.rt == null){ //查找树的右边比节点值大,找到最右边的节点即可
            return t;
        }
        return findMax(t.rt);
    }

    public static void main(String[] args) {
        BinarySearchTree<Integer> binarySearchTree = new BinarySearchTree<Integer>();
        binarySearchTree.insert(8);
        binarySearchTree.insert(4);
        binarySearchTree.insert(6);
        binarySearchTree.insert(3);
        binarySearchTree.insert(14);
        binarySearchTree.insert(10);
        System.out.println("最小值: "+binarySearchTree.findMin());
        System.out.println("最大值: "+binarySearchTree.findMax());
        binarySearchTree.printTree();
        binarySearchTree.remove(8);
        System.out.println();
        binarySearchTree.printTree();
    }
}
时间: 2024-12-20 22:30:38

二叉查找树--java的相关文章

二叉查找树java实现

主要参考<<数据结构与算法分析>>Java语言描述(Mark Allen Weiss) 二叉查找树主要的操作是:1.查找,2,插入,删除. 查找操作:从根节点开始,递归查找.如果值等于当前根节点,返回根节点存储的值.若果查找的值小于跟根节点的值,则查找左子树,反之递归查找右子树.如果要查找的当前节点为NULL,说明查找结束了,没有找到要查找的元素. 插入操作:基本和查找操作相同,只是最后加入找到的是null,则新建一个节点,并返回. 删除操作:找到要删除的节点,让右子树最左边的节点

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

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

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