二分搜索树基础

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

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

 

二、二叉树

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

  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 }
复制代码

 

add 的改进

复制代码
 1  // 向二分搜索树中添加新的元素e
 2 31     public void add(E e){
 3            root = add(root,e);
 4 40     }
 5 41 
 6 42     
 7 43     // 向以node为根的二分搜索树中插入元素e,递归算法
 8 44     private Node add(Node node, E e){
 9 45        
10 55         if(null == node){
11                  size++;
12 56             return new Node(e);
13 57         }else if(e.compareTo(node.e) < 0){
14 58             node.left = add(node.left, e);
15 61         }else if(e.compareTo(node.e) > 0){
16 62             node.right = add(node.right, e);
17 65         }
18 74 }                                    
复制代码

 

posted @   hellozwx  阅读(395)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示