当前位置:  编程技术>c/c++/嵌入式

二叉查找树的插入,删除,查找

    来源: 互联网  发布时间:2014-10-19

    本文导语:  二叉查找树是满足以下条件的二叉树:1、左子树上的所有节点值均小于根节点值,2、右子树上的所有节点值均不小于根节点值,3、左右子树也满足上述两个条件。 二叉查找树的插入过程如下:1.若当前的二叉查找树为空,则...

二叉查找树是满足以下条件的二叉树:
1、左子树上的所有节点值均小于根节点值,
2、右子树上的所有节点值均不小于根节点值,
3、左右子树也满足上述两个条件。

二叉查找树的插入过程如下:
1.若当前的二叉查找树为空,则插入的元素为根节点,
2.若插入的元素值小于根节点值,则将元素插入到左子树中,
3.若插入的元素值不小于根节点值,则将元素插入到右子树中。

二叉查找树的删除,分三种情况进行处理:
1.p为叶子节点,直接删除该节点,再修改其父节点的指针(注意分是根节点和不是根节点),如图a。

2.p为单支节点(即只有左子树或右子树)。让p的子树与p的父亲节点相连,删除p即可;(注意分是根节点和不是根节点);如图b。

3.p的左子树和右子树均不空。找到p的后继y,因为y一定没有左子树,所以可以删除y,并让y的父亲节点成为y的右子树的父亲节点,并用y的值代替p的值;或者方法二是找到p的前驱x,x一定没有右子树,所以可以删除x,并让x的父亲节点成为y的左子树的父亲节点。如图c。

  

插入节点的代码:

代码如下:

struct node
{
    int val;
    pnode lchild;
    pnode rchild;
};

pnode BT = NULL;


//递归方法插入节点
pnode insert(pnode root, int x)
{
    pnode p = (pnode)malloc(LEN);
    p->val = x;
    p->lchild = NULL;
    p->rchild = NULL;
    if(root == NULL){
        root = p;   
    }   
    else if(x < root->val){
        root->lchild = insert(root->lchild, x);   
    }
    else{
        root->rchild = insert(root->rchild, x);   
    }
    return root;
}

//非递归方法插入节点
void insert_BST(pnode q, int x)
{
    pnode p = (pnode)malloc(LEN);
    p->val = x;
    p->lchild = NULL;
    p->rchild = NULL;
    if(q == NULL){
        BT = p;
        return ;   
    }       
    while(q->lchild != p && q->rchild != p){
        if(x < q->val){
            if(q->lchild){
                q = q->lchild;   
            }   
            else{
                q->lchild = p;
            }       
        }   
        else{
            if(q->rchild){
                q = q->rchild;   
            }   
            else{
                q->rchild = p;   
            }
        }
    }
    return;
}


查找节点的代码:
代码如下:

pnode search_BST(pnode p, int x)
{
    bool solve = false;
    while(p && !solve){
        if(x == p->val){
            solve = true;   
        }   
        else if(x < p->val){
            p = p->lchild;   
        }
        else{
            p = p->rchild;   
        }
    }
    if(p == NULL){
        cout lchild;   
        }
        else{   //沿右子树找
            q = p;
            p = p->rchild;   
        }
    }
    if(p == NULL){   //没找到
        cout lchild == p){  
            q->lchild = NULL;
        }       
        else{
            q->rchild = NULL;   
        }
        free(p);  //释放节点p
    }
    else if(p->lchild == NULL || p->rchild == NULL){ //p为单支子树
        if(p == BT){  //p为根节点
            if(p->lchild == NULL){
                BT = p->rchild;   
            }   
            else{
                BT = p->lchild;   
            }
        }   
        else{
            if(q->lchild == p && p->lchild){ //p是q的左子树且p有左子树
                q->lchild = p->lchild;    //将p的左子树链接到q的左指针上
            }   
            else if(q->lchild == p && p->rchild){
                q->lchild = p->rchild;   
            }
            else if(q->rchild == p && p->lchild){
                q->rchild = p->lchild;   
            }
            else{
                q->rchild = p->rchild;
            }
        }
        free(p);
    }
    else{ //p的左右子树均不为空
        pnode t = p;
        pnode s = p->lchild;  //从p的左子节点开始
        while(s->rchild){  //找到p的前驱,即p左子树中值最大的节点
            t = s;  
            s = s->rchild;   
        }
        p->val = s->val;   //把节点s的值赋给p
        if(t == p){
            p->lchild = s->lchild;   
        }   
        else{
            t->rchild = s->lchild;   
        }
        free(s);
    }
    return find;
}

    
 
 

您可能感兴趣的文章:

  • Linux c++库boost unordered_set数据插入及查找代码举例
  • java二分查找插入法
  • Linux c++库boost unordered_map数据插入及查找代码举例
  • C语言实现带头结点的链表的创建、查找、插入、删除操作
  • c++类库Boost.Bimap(遍历,插入,查找,删除)参考代码
  • c++双向链表操作示例(创建双向链、双向链表中查找数据、插入数据等)
  • c++ STL关联式容器Map成员函数介绍及查找(find()),插入(insert()),删除(erase())等操作代码举例
  • 如何查找 删除 linux不断增加的垃圾日志文件?
  • Oracle中用Rowid查找和删除重复记录
  • HTML教程 iis7站长之家
  • 在线等!如何用bash实现:在一个文件中查找某个字符串,只保留该字符串的第一次出现,剩下的全部删除?
  • php查找指定字符串并删除
  • 查找并删除位于多个文件夹下的某些文件
  • SQL查找删除重复行实例教程
  • sql server 临时表 查找并删除的实现代码
  • Oracle 查找与删除表中重复记录的步骤方法
  • c语言实现的货物管理系统实例代码(增加删除 查找货物信息等功能)
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ Strings(字符串) 成员 rfind():查找最后一个与value相等的字符(逆向查找)
  • Linux查找包含指定文字的文件(linux查找指定文件)
  • C++ Maps 成员 find():查找一个元素
  • php顺序查找与二分查找实例
  • C++ MultiMaps 成员 find():查找元素
  • php顺序查找和二分查找示例
  • C++ Strings(字符串) 成员 find():在字符串中查找字符
  • 在unix查找某个目录下一小时前的生成的文件,怎么查找?find只能按天来查。
  • C++ Strings(字符串) 成员 find_first_of():查找第一个与value中的某值相等的字符
  • vim怎么查找并替换 “[bx][si]”呢。。貌似是因为两个中括号连在一起查找不到。。
  • C++ Strings(字符串) 成员 find_last_of():查找最后一个与value中的某值相等的字符
  • Linux下怎么查找指定文件大小的文件?如查找100MB以上的文件
  • C++ Strings(字符串) 成员 find_first_not_of():查找第一个与value中的所有值都不相等的字符
  • 还发一个查找文件的贴子,给一个相对目录USR0怎样用JAVA查找其下的文件
  • C++ Strings(字符串) 成员 find_last_not_of():查找最后一个与value中的所有值都不相等的字符
  • java 折半查找法(二分查找)实例
  • HASH查找的程序实现及性能分析
  • php字符串查找 查找字符最后一次出现位置
  • 根据文件大小查找文件的find命令举例(Linux,centos,redhat)
  • jquery 父页面查找iframe子页面内容、子页面查找父页面内容
  • linux下grep命令实现查找多个关键字(与关系和或关系)
  • 高分急求:UNIX环境下查找字符串的问题 (给出文件路径,和需要查找的字符串)工作急需,恳求各位高手帮忙!!!!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3