玩转数据结构:第6章 二分搜索树

二分搜索树



6-1 为什么要研究树结构

树结构

为什么要有树结构?

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

将数据使用树结构存储后,出奇的高效。

  • 二分搜索树(Binary Search Tree)
  • 平衡二叉树:AVL;红黑树
  • 堆;并查集
  • 线段树;Trie(字典树,前缀树)

6-2 二分搜索树基础

和链表一样,动态数据结构。

二叉树,具有天然递归结构。

  • 每个节点的左子树也是二叉树
  • 每个节点的右子树也是二叉树

  • 二叉树每个节点最多有一个父亲

二分搜索树 Binary Search Tree

二分搜索树是二叉树

二分搜索树,存储的元素必须有可比较性。

BST.java

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

    private class Node {
        public E e;
        public Node left, right;

        public Node(E e) {
            this.e = e;
            left = null;
            right = null;
        }
    }

    private Node root;
    private int size;

    public BST(){
        root = null;
        size = 0;
    }

    public int size(){
        return size;
    }

    public boolean isEmpty(){
        return size == 0;
    }
}

6-3 向二分搜索树中添加元素

03-Add-Elements-in-BST

BST.java

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

    private class Node {
        public E e;
        public Node left, right;

        public Node(E e) {
            this.e = e;
            left = null;
            right = null;
        }
    }

    private Node root;
    private int size;

    public BST(){
        root = null;
        size = 0;
    }

    public int size(){
        return size;
    }

    public boolean isEmpty(){
        return size == 0;
    }

    // 向二分搜索树中添加新的元素e
    public void add(E e){

        if(root == null){
            root = new Node(e);
            size ++;
        }
        else
            add(root, e);
    }

    // 向以node为根的二分搜索树中插入元素e,递归算法
    private void add(Node node, E e){
        if(e.equals(node.e))
            return;
        else if(e.compareTo(node.e) < 0 && node.left == null){
            node.left = new Node(e);
            size ++;
            return;
        }
        else if(e.compareTo(node.e) > 0 && node.right == null){
            node.right = new Node(e);
            size ++;
            return;
        }

        if(e.compareTo(node.e) < 0)
            add(node.left, e);
        else //e.compareTo(node.e) > 0
            add(node.right, e);
    }
}

6-4 改进添加操作:深入理解递归终止条件

原文地址:https://www.cnblogs.com/MarlonKang/p/12351177.html

时间: 2024-11-09 18:33:59

玩转数据结构:第6章 二分搜索树的相关文章

玩转数据结构 从入门到进阶

第1章 欢迎学习<玩转数据结构>欢迎大家学习<玩转数据结构>课程.在这个课程中,我们将从底层实现诸多数据结构,从简单,到复杂,并且探索他们的应用.在这一章,我们将来看一看数据结构的具体作用,学习数据结构的误区,学习这个课程的注意事项,和课程环境的基本搭建:) ...1-1 欢迎学习<玩转数据结构>1-2 学习数据结构(和算法)到底有没有用?1-3 关于课程学习的更多注意事项1-4 课程编程环境搭建 第2章 不要小瞧数组数组,看似是最简单的数据结构,但是,大多数语言为我们

第二十六篇 玩转数据结构——二分搜索树

1.. 二叉树 跟链表一样,二叉树也是一种动态数据结构,即,不需要在创建时指定大小. 跟链表不同的是,二叉树中的每个节点,除了要存放元素e,它还有两个指向其它节点的引用,分别用Node left和Node right来表示. 类似的,如果每个节点中有3个指向其它节点的引用,就称其为"三叉树"... 二叉树具有唯一的根节点. 二叉树中每个节点最多指向其它的两个节点,我们称这两个节点为"左孩子"和"右孩子",即每个节点最多有两个孩子. 一个孩子都没有

玩转数据结构——二分搜索树基础

一.树结构本身是一种天然的组织结构 将数据使用树结构后,出奇的高效. 二.二叉树 和链表一样,动态数据结构 class Node{ E e; Node left; Node right; } 二叉树(多叉树) 二叉树具有唯一根节点 class Node{ E e; Node left; <-- 左孩子 Node right; <-- 右孩子 } 二叉树每个节点最多有两个孩子节点 二叉树每个节点最多有一个父节点 二叉树具有天然递归结构 每个节点的左子树也是二叉树 每个节点的右子树也是二叉树 二叉

数据结构之二分搜索树(六)

二分搜索树是二叉树的一种. 二叉树就是有左右节点,有唯一根节点的树类数据结构.二叉树具有天然递归结构,每个父亲节点的左右子树也是二叉树 class Node{ E e; Node left; Node right; } 上图是一个满二分搜索树,但用的时候不一定是满的, 符合条件就行.所以存储的元素必须具有可比较性(对于对象,可以自定义比较规则).继承Comparable接口 二分搜索树新增节点 //添加一个节点 public void add(E e) { root = add(root,e);

玩转数据结构:第7章 集合和映射

7-1 集合基础和基于二分搜索树的集合实现 07-Set-and-Map 集合 01-Set-Basics-and-BSTSet 文件IO操作,简单分词工具类 FileOperation import java.io.FileInputStream; import java.util.ArrayList; import java.util.Scanner; import java.util.Locale; import java.io.File; import java.io.BufferedI

玩转数据结构 java描述 一 概况

第一章 介绍,数据结构是计算机专业的同学必学的课程 数据结构研究的是数据如何在计算机进行组织和存储,使得我们可以高效的获取数据或者修改数据. 数据结构可以分为三种结构: 线性结构:数组:栈:队列:链表:哈希表 树结构:二叉树,二分搜索树,AVL,红黑树,Treap,Splay,堆,Trie,线段树,K-D树,并查集,哈夫曼树 图结构 邻接矩阵,邻接表 我们需要根据应用的不同,灵活选择最合适的数据结构, 例子: 1,数据库, 它已经封装好了,使用SQL语言就可以使用数据库, SELECT * FR

第二十七篇 玩转数据结构——集合(Set)与映射(Map)

1.. 集合的应用 集合可以用来去重 集合可以用于进行客户的统计 集合可以用于文本词汇量的统计 2.. 集合的实现 定义集合的接口 Set<E> ·void add(E) // 不能添加重复元素 ·void remove(E) ·boolean contains(E) ·int getSize() ·boolean isEmpty() 集合接口的业务逻辑如下: public interface Set<E> { void add(E e); void remove(E e); bo

6-5、6、7... 二分搜索树的查询操作、前序遍历

二分搜索树的contains方法实现逻辑如下: 1 // 看二分搜索树中是否包含元素e 2 public boolean contains(E e){ 3 return contains(root, e); 4 } 5 6 // 看以node为根的二分搜索树中是否包含元素e, 递归算法 7 private boolean contains(Node node, E e){ 8 9 if(node == null) 10 return false; 11 12 if(e.compareTo(nod

01玩转数据结构_08_堆和优先队列

堆: 树这种结构 本身在计算机科学领域 占有很重要的地位,这种数据结构之所以占有重要的地位,不仅仅是因为二分搜索树这样的一种结构, 是树本身这种形状可以产生很多拓展,对于不同的问题 ,我们可以稍微改变 或者 限制树这种数据结构的性质,从而产生不同的数据结构,高效的解决不同的问题, 从节开始,将会有四个章节介绍 四个不同的例子,它们分别是堆,线段树,字典树 以及 并查集 ,通过这些不同的树的结构,我们可以领会到 数据结构的灵活之处, 什么是优先队列: 优先队列(相对 高层的数据结构) 是 出队,入