• 动态查找表之二叉排序树


    二叉排序树(Binary Sort Tree)或者是一棵空树;或者是具有如下性质的二叉树:1)若左子树不空,则左子树上所有节点的值均小于它的根节点的值 2)若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值 3)它的左右子树也分别为二叉排序树。


    二叉排序树的查找

    int SearchBST(BiTree T,KeyType key, BiTree f,BiTree &p)
    {
    //在根指针T所指二叉排序树中递归地查找其关键字等于key的数据元素,若查找成功,
    //则指针p指向该数据元素节点,并返回true,否则指针p指向查找路径上访问的
    //最后一个节点并返回false,指针f指向T的双亲,其初始调用值为NULL
    if(!T) {p=f;return false;}
    else if(key==T->data.key) {p=T; return true;}
    else if(key<T->data.key) return SearchBST(T->lchild,key,T,p);
    else return SearchBST(T->rchild,key,T,p);
    }

    二叉排序树的插入

    int InsertBST(BiTree &T,ElemType e)
    {
    //当二叉排序树T中不存在关键字等于e.key的数据元素时,插入e并返回true,否则,返回false
    if(!SearchBST(T,e,NULL,p)
    {
    s = (BiTree)malloc(sizeof(BiTNode));
    s->data= e; s->lchild=s->rchild=NULL;
    if(!p) T=s;
    else if(e.key<p->data.key)	p->lchild=s;
    else p->rchild=s;
    return true;
    }
    else
    return false;
    }
    


    二叉排序树的删除


    int DeleteBST(BiTree &T, KeyType key)
    {
    //若二叉排序树T中存在关键字等于key的数据元素时,则删除该数据元素节点
    //并返回true,否则,返回false
    if(!T) return false;
    else
    {
    if(key==T->data.key) return Delete(T);
    else if(key<T->data.key) return DeleteBST(T->lchild,key);
    else return DeleteBST(T->rchild,key);
    }
    }
    int Delete(BiTree &p)
    {
    //从二叉排序树中删除节点p,并重接它的左或右子树
    if(!p->lchild)
    {q=p;p=p->rchild;free(q);}
    else if(!p->rchild)
    {q=p;p=p-lchild;free(q);}
    else //左右子树均不空
    {
    q=p;s=p->lchild;
    while(p->rchild)
    {
    q=s;
    s=s->rchild;
    }
    p->data= s->data;
    if(q!=p)
    q->rchild=s->lchild;
    else
    q->lchild=s->lchild;
    free(s);
    }
    return true;
    }


    为什么会有平衡二叉树呢? 

    二叉排序树的查找性能:最好的情况是,二叉排序树的形态和折半查找的判定树相同,其平均查找长度和lgn成正比;最坏的情况下,二叉排序树为单支树(因为序列本来就有序),这时平均查找长度为(n+1)/2。 在随机情况下,二叉排序树的平均查找长度和lgn是等数量级的。


    为了避免最坏情况的出现,对二叉树进行平衡化处理,这就是为什么会出现平衡二叉树。



  • 相关阅读:
    Mac之雕虫小技
    Python 合并两个字典(Dictionary)中相同key的value的方法
    linux只保留最新n个文件
    自动化测试笔记
    python实现一个判断时间的装饰,并抛出自定义异常
    python在字典列表中计算具有特定键的元素
    canvas游戏
    教为学:Oracle 11g OCP之路(七):数据结构
    教为学:Oracle 11g OCP之路(八):用户权限管理
    ADO.NET入门教程(六) 谈谈Command对象与数据检索
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3030605.html
Copyright © 2020-2023  润新知