《算法》笔记-3.2二叉查找树

来源:互联网 发布:金属徽章定制价格淘宝 编辑:程序博客网 时间:2024/06/14 11:37

3.2 二叉查找树

         二叉查找树(BST):是一棵二叉树,每个结点都含有一个Comparable的键(以及相关联的值),每个结点的键都大于其左子树中的任意结点的键,小于其右子树的任意结点的键。

        一棵二叉查找树代表一组键和值的集合,同一个集合可以用不同的二叉查找树表示。

       中序遍历二叉树,是键值从小到大的排序。

3.2.1 基本实现

      二叉树的数据表示

      每个结点包含一个键、

      一个值、

      一条左链接(小于该结点的所有键组成的二叉树)、

     一条右链接、

     一个结点计数器(N:以该节点为根节点的子树中的结点总数);

     root变量指向根节点Node对象;

     二叉树的查找get()算法:(递归)

     如果树是空的,则查找未命中;

     如果查找的键和根节点的键相等,则命中;

     否则在适当的子树中继续查找;

     递归调用后的代码,对应这一系列的return指令;

     二叉树的插入put()算法:(递归,与get相似)

     如果树是空的,则返回一个含该键值对的新结点;

     如果查找的键小于根节点的键,在左子树中插入该结点,如果查找的键大于根节点的键,在右子树中插入该结点;

     如果查找的键等于根节点的键,则修改值;

     递归调用后的代码,对应这重置搜索路径上每个结点的计数器N;

     代码如下:

public class BST<Key extendsComparable<Key>,Value> {    private Noderoot;    private class Node{        private Key key;        private Value val;        private Nodeleft,right;        private int N;//以该节点为根的子树中节点的总数        public Node(Key key, Value val,int N){            this.key = key;            this.val = val;            this.N = N;        }    }    public int size(){        return size(root);    }    public int size(Nodex){        if(x == null) return 0;        else return x.N;        //return size(x.left) + size(x.right) + 1;    }    public Valueget(Key key){        return get(root,key);    }    private Value get(Node x, Key key){        //以x为根节点找key对应的val        if(x == null) return null;        int cmp =key.compareTo(x.key);        if(cmp< 0)return get(x.left, key);        else if(cmp> 0)return get(x.right, key);        else return x.val;    }    public void put(Key key, Valueval){        root = put(root, key, val);    }    private Nodeput(Node x, Key key, Value val){        //查找key,找到则更新它的值,否则为它创建新的节点        if(x == null) return new Node(key,val, 1);        int cmp =key.compareTo(x.key);        if(cmp< 0)        x.left =put(x.left,key,val);        else if(cmp> 0)   x.right =put(x.right,key,val);        else               x.val = val;        //沿着查找路径重置每个节点的N        x.N =size(x.left) + size(x.right) + 1;        return x;    }}

3.2.2 分析

      二叉查找树的算法运行时间取决于树的形状,树的形状取决于键被插入的先后顺序

      最好的情况是树是完全二叉树,最坏是只有左子树或只有右子树,一般情况是介于两者之间;

      假设键的分布均匀,或者说键的插入顺序是随机的,那么树的根节点相当于快排算法的第一个切分元素(左侧键比它小,右侧键比它大)

      在由N个随机键构造的二叉查找树中,查找命中平均所需的比较次数为~2

      在由N个随机键构造的二叉查找树中插入操作和查找未命中平均所需的比较次数为~2

3.2.3 有序性相关的方法与删除操作

3.2.3.1最大最小键

       如果根节点的左链接为null,那么一棵二叉查找树中最小的键是根节点;

       如果左链接为非null,那么树中的最小键是左子树中的最小键

3.2.3.2向上取整和向下取整

       如果给定的键key小于二叉查找树的根节点的键,那么小于等于key的最大键floor(key)一定在根节点的左子树上;

       如果给定给定键key大于二叉查找树的根节点,那么只有当根节点右子树中存在小于等于key的节点时,小于等于key的最大键才在右子树上;否则就是根节点;

3.2.3.3选择操作

      找到排名为k的键(从开始排名,即正好有k个小于它的键);

      如果左子树中的结点数t大于k,就递归地在左子树中查找排名为k的键;

      如果左子树中的节点数t等于k,则返回根节点中的键;

      如果t小于k,则递归地在右子树中查找排名为k-t-1的键;

3.2.3.4排名

       返回给定键的排名

       如果给定键和根节点的键相等,则返回左子树中的节点总数t;

       如果给定键小于根节点,返回递归计算的左子树中的排名;

       如果给定键大于根节点,返回递归计算的右子树中的排名+t+1;

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 法国第一年语言没有通过怎么办 听力42天未通过怎么办 7岁儿童叛逆期怎么办 被忽视型幼儿该怎么办 言语发育障碍脑神经损伤怎么办 5岁幼儿胆子小怎么办 幼儿20天胆子小怎么办 两岁宝宝胆子小怎么办 两岁的宝宝胆子小怎么办 孕中期发烧38度怎么办 小班社会交往教案有垃圾怎么办 两个月婴幼儿哭闹入睡难怎么办 8岁儿童睡觉困难怎么办 做精细动作手抖怎么办 15个月宝宝缺锌怎么办 八个月宝宝有蛔虫怎么办 两个月婴儿缺锌怎么办 婴儿天热出汗多尿少怎么办 婴儿5个月不主动抓东西怎么办 打疫苗吃了辣怎么办 四个月宝宝枕秃怎么办 四个月的孩子缺钙怎么办 小孩张牙齿会发烧怎么办 对节白蜡叶子干了怎么办 刷机字库坏了怎么办 魅蓝返回键失灵怎么办 牙蛀严重且牙根松动怎么办 蛀牙伤到神经了怎么办 给客户发错邮件怎么办外贸 cf没有枪声和脚步声怎么办 穿越火线fps太低怎么办 win10玩cf没有声音怎么办 儿子死了欠的钱怎么办 儿子欠银行的钱怎么办 惹了社会上的混混怎么办 我是五年级惹上混混怎么办 孩子挨欺负家长怎么办幼儿园 孩子被同学欺负不敢上学怎么办 孩子被欺负不敢还手怎么办 2个月的婴儿内热怎么办 孩子把别人打了怎么办