玩转数据结构(十三)构建BST

本文介绍了二分搜索树的概念、性质,并详细阐述了如何实现包括初始化、添加结点、查找、遍历、删除操作在内的各种基本功能。通过理解二分搜索树的原理,可以有效地进行数据查找和插入,提高效率。
摘要由CSDN通过智能技术生成

1、二分搜索树简介


二分搜索树又称为二叉搜索树、排序二叉树等,是指一棵空树或者具有以下性质的二叉树:

  • 若任意一个结点的左子树不为空,则左子树所有结点的值均小于它的根结点的值
  • 若任意一个结点的右子树不为空,则右子树所有结点的值均大于它的根结点的值
  • 任意结点的左右子树分别也为二分搜索树
  • 没有数值相等的结点

二分搜索树是一种基本的数据结构,可以用来构建更为抽象的数据结构,如:set、map等。

二分搜索树和其他数据结构相比较优势在于插入和查找时间复杂度低,为O(logn)。

2、二分搜索树的实现

2.1 树结点的定义

注意:BST定义时,泛型需要继承Comparable接口,只有具有可比较性的数据类型,才能构建二分搜索树。

public class BST<E extends Comparable<E>> {...}

在BST定义内部类Node:

 private class Node {
        public E e;         //结点存储的数据
        public Node left;   //左孩子
        public Node right;  //右孩子

        public Node(E e) {
            this.e = e;
            this.left = null;
            this.right = null;
        }
    }
2.2 初始化BST
    private Node root;//根结点
    private int size; 

    public BST() {//构造方法
        root = null;
        size = 0;
    }
2.3 获取size和判空
 public int size() {
        return size;
    }

    public boolean isEmpty() {
        return size == 0;
    }
2.4 向BST中添加结点
 public void add(E e) {
        root = add(root, e);
    }

    //添加结点-递归代码
    private Node add(Node node, E e) {
        //递归出口
        if(node == null) {
            size++;
            return new Node(e);
        }

        if(e.compareTo(node.e) < 0) {
            node.left = add(node.left, e);
        } else if(e.compareTo(node.e) > 0) {
            node.right = add(node.right, e);
        }//这里并没有对值相等进行判断,因为此BST不支持重复元素

        return node;
    }
2.5 判断BST中是否包含某个元素
public boolean contains(E e) {
        return contains(root, e);
    }

    public boolean contains(Node node, E e) {
        //递归出口
        if(node == null) {
            return false;
        }

        if(e.compareTo(node.e) == 0) {
            return true;
        } else if(e.compareTo(node.e) < 0) {
            return contains(node.left, e);
        } else {//e.compareTo(node.e) > 0
            return contains(node.right, e);
        }
    }
2.6 前序遍历

递归实现:

  public void preOrder() {
        preOrder(root);
    }

    //前序遍历--递归算法
    private void preOrder(Node node) {
        if(node == null) {
            return;
        }

        System.out.println(node.e);
        preOrder(node.left);
        preOr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值