zoukankan      html  css  js  c++  java
  • 二叉排序树

    int source[]={54,90,6,69,12,37,92,28,65,83};
    
    void InsertBST(BSTree *t,int key)//在二叉排序树中插入关键字key
    {
        head=t;
        while(head) //查找需要添加的父结点 
        {
            parent=head;
            if(key<head->data) //若关键字小于结点的数据 
                head=head->left; //在左子树上查找 
            else                 //若关键字大于结点的数据 
                head=head->right;  //在右子树上查找                             
        }
        //判断添加到左子树还是右子树 
        if(key<parent->data) //小于父结点 
            parent->left=p; //添加到左子树
        else           //大于父结点 
            parent->right=p; //添加到右子树 
    }
    
    
    BSTree *SearchBST(BSTree *t,int key)
    {
        if(!t || t->data==key) //结点为空,或关键字相等 
            return t;          //返回结点指针
        else if(key>t->data) //关键字大于结点数据
            return(SearchBST(t->right,key));
        else
            return(SearchBST(t->left,key));
    }
    
    void BST_LDR(BSTree *t)  //中序遍历 
    {
         if(t)//树不为空,则执行如下操作 
         {
             BST_LDR(t->left); //中序遍历左子树
             printf("%d ",t->data); //输出结点数据 
             BST_LDR(t->right); //中序遍历右子树/
         }
         return; 
    } 
    
    
    //删除结点
    void BST_Delete(BSTree *t,int key)
    {
        BSTree *p,*parent,*l,*l1;
        int child=0;//0表示左子树,1表示右子树 
        if(!t) return;     //二叉排序树为空,则退出
        p=t;
        parent=p;
        while(p)           //二叉排序树有效 
        {        
            if(p->data==key)
            {
                if(!p->left && !p->right) //删除节点为叶结点(左右子树都为空) 
                {
                    if(p==t) //被删除的是根结点 
                    {
                        free(p);//释放被删除结点 
                    }
                    else if(child==0) //删除节点是父结点的左子树 
                    {
                        parent->left=NULL; 
                        free(p); 
                    }
                    else //删除节点是父结点的右子树 
                    {
                        parent->right=NULL; 
                        free(p); 
                    }
                }
                else if(!p->left) //删除节点只有右子树
                {
                    if(child==0) //删除节点是父结点的左子树
                        parent->left=p->right;
                    else //删除节点是父结点的右子树             
                        parent->left=p->left;
                    free(p); //释放被删除结点
                }
                else if(!p->right)//右子树为空,左子树不为空
                {
                     if(child==0) //是父结点的左子树
                        parent->right=p->right;
                    else //是父结点的右子树             
                        parent->right=p->left;
                    free(p); //释放被删除结点       
                }
                else  //左右子树都不为空 
                {
                    l1=p; //保存左子树的父结点 
                    l=p->right; //从当前结点的右子树进行查找 
                    while(l->left) //左子树不为空 ,被删除节点的右子树中的最小值。
                    {
                        l1=l;
                        l=l->left; //查找左子树 
                    }
                    p->data=l->data; //将左子树的数据保存到被删除结点
                    l1->left=NULL; //设置父结点的左子树指针为空 
                    free(l1); //释放左子树占的内存空间
                }
                p=NULL;
            }
            else if(key<p->data) //需删除记录的关键字小于结点的数据 
            {
                child=0;//标记在当前结点左子树查找
                parent=p; //保存当前结点作父结点 
                p=p->left; //查找右子树 
            }
            else //需删除记录的关键字大于结点的数据 
            {
                child=1;//标记在当前结点右子树查找
                parent=p;//保存当前结点作父结点 
                p=p->right; //查找右子树 
            }    
        } 
    }
  • 相关阅读:
    Android官方命令深入分析之bmgr
    Android官方命令深入分析之AVD Manager
    Android 官方命令深入分析之android
    token的设置与获取
    SpringBoot使用Redis共享用户session信息
    thymeleaf资源加载问题(从Controller跳转)
    ajax传递数组,后台更新
    BootStrap表单验证用户名重复
    hadoop3.x.x错误解决
    Hadoop安装
  • 原文地址:https://www.cnblogs.com/yaowen/p/4489834.html
Copyright © 2011-2022 走看看