美文网首页
二叉排序树的实现

二叉排序树的实现

作者: 嗷老板 | 来源:发表于2019-03-20 21:52 被阅读0次

二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:

(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;

(3)左、右子树也分别为二叉排序树;

结点的定义

package com.tree;

public class TreeNode {

    private int data = 0;
    private TreeNode Lchild;
    private TreeNode Rchild;
    
    public TreeNode() {
        
    }

    public TreeNode(int data, TreeNode lchild, TreeNode rchild) {
        super();
        this.data = data;
        Lchild = lchild;
        Rchild = rchild;
    }

    public int getData() {
        return data;
    }

    public void setData(int data) {
        this.data = data;
    }

    public TreeNode getLchild() {
        return Lchild;
    }

    public void setLchild(TreeNode lchild) {
        Lchild = lchild;
    }

    public TreeNode getRchild() {
        return Rchild;
    }

    public void setRchild(TreeNode rchild) {
        Rchild = rchild;
    }
    
}

二叉排序树的实现

package com.tree;


public class BinSearchTree {

    private TreeNode root;
    
    public BinSearchTree() {
        this(null);
    }

    public BinSearchTree(TreeNode root) {
        this.root = root;
    }
    
    public void makeEmpty()
    {
        root = null;
    }
    
    public boolean isEmpty()
    {
        return (root == null)?true:false;
    }
    
    /**
     * 查找树中是否有元素value,如果有返回true
     * @param value
     * @return
     */
    public boolean contains(int value)
    {
        return contains(value,root);
    }
    
    private boolean contains(int value,TreeNode node)
    {
        if(node == null)
        {
            return false;
        }
        if(value < node.getData())
        {
            return contains(value,node.getLchild());
        }
        else if(value > node.getData())
        {
            return contains(value,node.getRchild());
        }else
        {
            return true;
        }
        
    }
    
    /**
     * 查找二叉树中的最小值
     * @return
     */
    public int findMin()
    {
        return findMin(root).getData();
    }
    
    private TreeNode findMin(TreeNode node)
    {
        if(node == null)
        {
            return null;
        }else if(node.getLchild() == null)
        {
            return node;
        }
        
        return findMin(node.getLchild());
    }
    
    /**
     * 查找二叉树中的最大值
     * @return
     */
    public int findMax()
    {
        return findMax(root).getData();
    }
    
    private TreeNode findMax(TreeNode node)
    {
        if(node == null)
        {
            return null;
        }
        else if(node.getRchild() == null)
        {
            return node;
        }
        return findMax(node.getRchild());
    }
    
    /**
     * 插入元素
     * @param value
     */
    public void insert(int value)
    {
        root = insert(value,root);
    }
    
    private TreeNode insert(int value,TreeNode node)
    {
        if(node == null)
        {
            return new TreeNode(value,null,null);
        }
        
        if(value < node.getData()){
            node.setLchild(insert(value,node.getLchild()));
        }else if(value > node.getData())
        {
            node.setRchild(insert(value,node.getRchild()));
        }
        
        return node;
        
    }
    
    /**
     * 删除节点
     * @param value
     */
    public void remove(int value)
    {
        if(!contains(value))
        {
            return;
        }
        
        root = remove(value,root);
    }
    
    private TreeNode remove(int value,TreeNode node)
    {
        if(node == null)
        {
            return null;
        }
        
        if(value < node.getData())
        {
            node.setLchild(remove(value,node.getLchild()));
        }else if(value > node.getData())
        {
            node.setRchild(insert(value,node.getRchild()));
        }else if(node.getLchild() != null && node.getRchild() != null){
            //如果当前节点有两个孩子节点,则将当前节点左子树中的最小值替换到当前节点
            TreeNode temp = findMin(node.getRchild());
            node.setData(temp.getData());
            //将右子树的最小值删除
            node.setRchild(remove(temp.getData(),node.getRchild()));
        }else
        {
            //如果被删除节点只有一个儿子节点 或是叶子节点
            node = (node.getLchild() != null) ? node.getLchild():node.getRchild();
        }
        
        return node;
    }
    
    public void inOrder()
    {
        inOrder(root);
    }
    
    private void inOrder(TreeNode node)
    {
        if(node != null)
        {
            inOrder(node.getLchild());
            System.out.println(node.getData());
            inOrder(node.getRchild());
        }
    }
}

测试

package com.tree;

public class Demo {

    public static void main(String[] args) {
        BinSearchTree tree = new BinSearchTree();
        
        tree.insert(5);
        tree.insert(7);
        tree.insert(3);
        tree.insert(1);
        tree.insert(9);
        tree.insert(6);
        tree.insert(4);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
        System.out.println("最小值:"+tree.findMin());
        System.out.println("最大值:"+tree.findMax());
        System.out.println("查找元素9是否存在:"+tree.contains(9));
        System.out.println("查找元素8是否存在:"+tree.contains(8));
        System.out.println("遍历二叉树");
        tree.inOrder();
    }
}

相关文章

网友评论

      本文标题:二叉排序树的实现

      本文链接:https://www.haomeiwen.com/subject/evsxvqtx.html