数据结构之: 二叉排序树

数据结构学习之:二叉排序树

二叉排序树概述

二叉排序树的规则比较简单:二叉排序树又名二叉搜索树(BST),对于二叉树中任何一个叶子节点,要求其左子节点小于当前节点,右子节点大于当前节点。根据名字我们可以知道这种二叉树结构它的查找效率是比较高的

如图所示:
在这里插入图片描述
它的中序遍历为:1 3 5 7 10 19 23
其实二叉排序树的中序遍历就是一个有序的数组

二叉排序树代码实现

package tree;

/**
 * 二叉排序树
 */
public class SortBinaryNode {
    private int value;
    private SortBinaryNode leftNode;
    private SortBinaryNode rightNode;

    public void setValue(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    public SortBinaryNode(int value) {
        this.value = value;
    }

    public SortBinaryNode getLeftNode() {
        return leftNode;
    }

    public void setLeftNode(SortBinaryNode leftNode) {
        this.leftNode = leftNode;
    }

    public SortBinaryNode getRightNode() {
        return rightNode;
    }

    public void setRightNode(SortBinaryNode rightNode) {
        this.rightNode = rightNode;
    }
    /**
     * 中序遍历二叉排序树
     */
    public void middleShow(SortBinaryNode node) {
        if (node == null) {
            return;
        }
        middleShow(node.getLeftNode());
        System.out.println(node.getValue());
        middleShow(node.getRightNode());
    }

    /**
     * @param value
     * @return
     */
    public SortBinaryNode search(int value) {
        if (this.getValue() == value){
            return this;
        }
        if (this.getValue()>value){
            return this.getLeftNode().search(value);
        }
        if (this.getValue()<value){
            return this.getRightNode().search(value);
        }

        return null;
    }
    /**
     * 搜索父节点
     *
     * @param value
     */
    public SortBinaryNode searchParent(int value) {
        if (this.getLeftNode()!=null && this.getLeftNode().getValue() == value ||
        this.getRightNode()!=null&& this.getRightNode().getValue()==value){
            return this;
        }
        else {
            if (this.value<value&&this.getLeftNode()!=null){
                return this.getLeftNode().searchParent(value);
            }
            if (this.value>value&&this.getRightNode()!=null){
                return this.getRightNode().searchParent(value);
            }
        }
        return null;
    }
}

package tree;

public class BinarySortTree {
    private SortBinaryNode root;

    /**
     * 添加二叉排序树
     *
     * @param node
     */
    public void add(SortBinaryNode node) {
        if (node == null) {
            return;
        }
        //判断当前节点的大小
        if (node.getValue() < root.getValue()) {
            if (root.getLeftNode() == null) {
                root.setLeftNode(node);
            } else {
                add(node);
            }
        } else {
            if (root.getRightNode() == null) {
                root.setRightNode(node);
            } else {
                this.add(node);
            }
        }
    }

    /**
     * 删除节点
     *
     * @param value
     */
    public void delete(int value) {
        if (root == null) {
            return;
        }
        SortBinaryNode target = root.search(value);
        SortBinaryNode parent = root.searchParent(value);
        //删除节点
        if (target.getLeftNode()==null&&target.getRightNode()==null){
            if (parent.getRightNode().getValue() == value){
                parent.setRightNode(null);
            }
            if (parent.getLeftNode().getValue()==value){
                parent.setLeftNode(null);
            }
        }
        //  删除有两个子节点的情况
        else if(target.getLeftNode()!=null&& target.getRightNode()!=null){
            int min = deleteMin(target.getRightNode());
            target.setValue(min);

        }
        //删除只有一个节点的情况
        else {
            if (target.getLeftNode()!=null){
                if (parent.getLeftNode().getValue()== value){
                    parent.setLeftNode(target.getLeftNode());
                }else {
                    parent.setRightNode(target.getLeftNode());
                }
            }
            else {
                if (parent.getRightNode().getValue()==value){
                    parent.setLeftNode(target.getRightNode());
                }else {
                    parent.setRightNode(target.getRightNode());
                }
            }
        }
    }

    private int deleteMin(SortBinaryNode node) {
        SortBinaryNode target = node;
        while (node.getLeftNode()!=null){
            target = node.getLeftNode();
        }
        delete(target.getValue());
        return target.getValue();
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值