二分搜索树(Binary Search Tree)

树结构

一、为什么要有树结构

树结构本身是一种天然的组织结构
高效

二、二分搜索树的基础

1、二叉树

性质:和链表一样,动态数据结构;二叉树具有唯一的根节点,二叉树每个节点最多有两个孩子,二叉树每个节点最多有一个父亲。
二叉树 具有天然递归结构;每个节点的左子树和右子树也是二叉树
在这里插入图片描述

Class Node{
   
E e;
Node left;
Node right;
}

总结:(1)叶子节点出现在二叉树的最底层,除叶子节点之外的其他节点都有两个孩子节点
(2)一个层数为k的满二叉树总结点数为:2^(k)-1
(3)第i层上的节点数为:2^(i-1)
(4)二叉树不一定是“满”的

2、二分搜索树

(1)二分搜索树是二叉树
(2)二分搜索树的每个节点的值:
大于其左子树的所有节点的值
小于其右子树的所有节点的值
(3)每一棵树也是二分搜索树
在这里插入图片描述

三、向二分搜索树添加元素

创建一个数组,向二分搜索树添加元素

 int[] arr = {
   28, 23, 15, 56, 34, 78};
        BinarySearch<Integer> bs = new BinarySearch<>();
        for (int i = 0; i < arr.length; i++) {
   
            bs.add(arr[i]);
        }

二分搜索树的图为:
在这里插入图片描述

    private Node add(Node root, T ele) {
   
        //如果根节点为空,创建一个新得二叉树,传ele参数进去
        if (root == null) {
   
            Node node = new Node(ele);
            return node;
        }
        //根节点不为空,将要添加的元素与跟的值进行比较大小
        //递归操作 不考虑等于的情况
        if (ele.compareTo(root.val) > 0) {
   
            root.right = add(root.right, ele);
        } else {
   
            root.left = add(root.left, ele);
        }
        return root;
    }

四、查询是否包含某个元素

  //2、查询二叉树节点是否包含节点
    public Node contains(T ele) {
   

        return contains(root, ele);
    }

    private Node contains(Node root, T ele) {
   
        if (root == null) {
   
            return null;
        }
        //递归
        T val = root.val;
        if (ele.compareTo(val) == 0) {
   
            return root;
        } else if (ele.compareTo(val) > 0) {
   
            return contains(root.right, ele);
        } else {
   
            return contains(root.left, ele);
        }
    }

在这里插入图片描述

五、前序遍历

中左右

    //3、前序遍历
    public List<T> preorder() {
   
        List<T> list = new LinkedList<>();
        preorder(root, list);
        return list;
    }

    private void preorder(Node root, List<T> list) {
   
        //遍历到最后
        if (root == null) {
   
            return;
        }
        //中左右 遍历左边 返回根节点 遍历右边
        list.add(root.val);
        middleorder(root.left, list);
        middleorder(root.right, list);
        return;
    }

在这里插入图片描述

六、中序遍历

左中右

    //3、中序遍历 (按顺序)
    public List<T> middleorder() {
   
        List<T> list = new LinkedList<>();
        middleorder(root, list);
        return list;
    }

    private void middleorder(Node root, List<T> list)
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值