数据结构----二叉搜索树

在数据结构中,二叉树是一种比较常见的树结构。在有的应用场景下,为什么要使用二查搜索树呢?使用二查搜索树可以给我们带来什么好处呢?

比如我们做查询操作时,数组的查询插入或者删除的最坏的时间复杂度是O(n)

当我们把这个数组进行排序以后,查询的最坏时间复杂度为o(log n),但是插入和删除元素的时间复杂度依然没有发生变化。

二叉搜素树的查询插入和删除的最坏时间复杂度都为o(log n),所以使用二叉搜索树可以大大的提高效率。

二叉搜索树服从以下的规则:

  任意一个节点的值都大于左子树节点的值

  任意一个节点的值都小于右子树节点的值

  每个节点的左右子树依然是一颗二叉搜索树

package com.BinarySearchTree;

import java.util.ArrayList;

public class BinarySearchTree {
    public static void main(String[] args) {
        BinarySearchTree binarySearchTree = new BinarySearchTree();
        binarySearchTree.add(7);
        binarySearchTree.add(4);
        binarySearchTree.add(9);
        binarySearchTree.add(2);
        binarySearchTree.add(5);
        binarySearchTree.add(8);
        binarySearchTree.add(11);
        binarySearchTree.add(1);
        binarySearchTree.add(3);
        binarySearchTree.add(12);
        binarySearchTree.print();
    }
    private int size;//记录集合的大小
    private Node root;//树的根节点
    public void add(Integer val){
        if(val == null){
            throw new IllegalArgumentException("val must not null");
        }

        if (size == 0  || root == null){//第一次插入,设置根节点
             root = new Node(val,null);//初始化根节点
             size++;
        }else{
            Node parent = root;//记录父节点
            Node node = root;
            int cmp = 0;
            while (node != null){//把值放到合适的位置
                parent = node;
                cmp = val - node.integer;
                if(cmp > 0){
                    node = node.right;
                }else if(cmp < 0){
                    node = node.left;
                }else{
                    return;
                }
            }
            if(cmp > 0){
                parent.right = new Node(val,parent);
            }else if(cmp < 0){
                parent.left = new Node(val,parent);
            }
        }
    }

    /**
     * 集合的容量
     * @return
     */
    public int size(){
        return size;
    }

    /**
     * 清除所有节点
     */
    public void clear(){

    }

    /**
     * 层级遍历
     */
    public void print() {
        ArrayList<Node> list = new ArrayList<>();
        ArrayList<Integer> valList = new ArrayList<>();

        list.add(root);//根节点入队
        valList.add(root.integer);
        int i = 0;
        while (i < list.size()){
            Node node = list.get(i);
            if(node.left != null){
                list.add(node.left);
                valList.add(node.left.integer);
            }
            if(node.right != null){
                list.add(node.right);
                valList.add(node.right.integer);
            }
            i++;
        }
        System.out.println(valList);
    }

    private static class  Node{
        Integer integer;
        Node left;
        Node right;
        Node parent;

        public Node(Integer integer, Node parent) {
            this.integer = integer;
            this.parent = parent;
        }
    }


}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值