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

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

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

二、二叉树

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

  class Node{

    E e;

    Node left;

    Node right;

  }

二叉树(多叉树)

二叉树具有唯一根节点

  class Node{

    E e;

    Node left;  <-- 左孩子  

    Node right;  <-- 右孩子

  }

二叉树每个节点最多有两个孩子节点

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

二叉树具有天然递归结构

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

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

二叉树不一定是“满”的,

如 : 10  一个节点也是二叉树

NULL 空也是二叉树

三、二分搜索树(Binary Search Tree)

二分搜索树是二叉树

二分搜索树的每个节点的值:

  大于其左子树的所有节点的值

  小于其右子树的所有节点的值

每一棵子树也是二分搜索树

存储的元素必须有可比较性

 1 public class BST<E extends Comparable<E>> {
 2
 3     private class Node {
 4         public E e;
 5         public Node left, right;
 6
 7         public Node(E e) {
 8             this.e = e;
 9             left = null;
10             right = null;
11         }
12     }
13
14     private Node root;
15     private int size;
16
17     public BST(){
18         root = null;
19         size = 0;
20     }
21
22     public int size(){
23         return size;
24     }
25
26     public boolean isEmpty(){
27         return size == 0;
28     }
29
30     // 向二分搜索树中添加新的元素e
31     public void add(E e){
32         if(null == root){
33             root = new Node(e);
34             size++;
35         }else{
36             add(root,e); // 待写
37         }
38
39         //size++;
40     }
41
42
43     // 向以node为根的二分搜索树中插入元素e,递归算法
44     private void add(Node node, E e){
45         /*
46         if(null == node || node.e == e){ // 注意区分 == 与 equals 的区别
47             node = new Node(e);         size++;
48             return;
49         }else if(node.e > e){
50             add(node.left,e);
51         }else{
52             add(node.right,e);
53         }
54         */
55         if(e.equals(node.e)){
56             return;
57         }else if(e.compareTo(node.e) < 0 && null == node.left){
58             node.left = new Node(e);
59             size++;
60             return;
61         }else if(e.compareTo(node.e) > 0 && null == node.right){
62             node.right = new Node(e);
63             size++;
64             return;
65         }
66
67         if(e.compareTo(node.e) < 0 ){
68             add(node.left, e);
69         }else{
70             add(node.right, e);
71         }
72
73     }
74 }

原文地址:https://www.cnblogs.com/zwxo1/p/11329809.html

时间: 2024-10-23 17:15:26

玩转数据结构——二分搜索树基础的相关文章

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

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

6-1 为什么要研究树结构 6-2 二分搜索树基础

6-1 为什么要研究树结构 6-2 二分搜索树基础 ---恢复内容结束--- 6-1 为什么要研究树结构 6-2 二分搜索树基础 ---恢复内容开始--- 6-1 为什么要研究树结构 6-2 二分搜索树基础 ---恢复内容结束--- 6-1 为什么要研究树结构 6-2 二分搜索树基础 二分搜索树基本代码 1 public class BST<E extends Comparable<E>> {//对于二分搜索树所存储的内容支持泛型,所以在这里写一个E,此外二分搜索树不是支持所有的类

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

二分搜索树 6-1 为什么要研究树结构 树结构 为什么要有树结构? 树结构本身是一种天然的组织结构 高效 将数据使用树结构存储后,出奇的高效. 二分搜索树(Binary Search Tree) 平衡二叉树:AVL:红黑树 堆:并查集 线段树:Trie(字典树,前缀树) 6-2 二分搜索树基础 和链表一样,动态数据结构. 二叉树,具有天然递归结构. 每个节点的左子树也是二叉树 每个节点的右子树也是二叉树 二叉树每个节点最多有一个父亲 二分搜索树 Binary Search Tree 二分搜索树是

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

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

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

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

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

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

玩转数据结构:第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

并行二分搜索树bianry search tree

二分搜索树是一种设计良好的有序集合,在平衡的情况下,查找search,插入insertion,删除deletion都具有O(logn)的计算时间.本文讨论实现二分搜索树的具体细节. 二分搜索树的每个结点包含key域,以及至多两个孩子结点,并且左孩子小于当前结点的值,右孩子大于当前结点值.为了方便操作,每个结点还需要维护父结点的信息.从上面的描述可以看出,二分搜索树的任何一个子树同样也是二分搜索树. 搜索操作是所有操作的基础.搜索操作可以很容易用递归过程描述:key>cur.key,则搜索右子树:

数据结构与算法基础学习笔记

*********************************************            ---算法与数据机结构--- 数据结构:由于计算机技术的发展,需要处理的对象不再是纯粹的数值,还有像字符,表,图像等具有一定结构的数据,需要用好的算法来处理这些数据. 我们把现实中大量而又复杂的问题以特定的数据类型的特定的存储结构保存到主存储器中,以及在此基础上为实现某个功能而执行的相应操作(查找排序),这个相应的操作也叫算法. 数据结构 = 个体 +个体的关系算法 =对存储数据的操