美文网首页
树几个操作:

树几个操作:

作者: 喜忧参半 | 来源:发表于2021-11-20 17:18 被阅读0次

    树的数据结构

    typedef   struct  Bnode   
       { int data;   
         struct  Bnode  *Lson, *Rson; 
    } Bnode, *Bptr;  
    

    记录当前结点孩子的个数

    void child(Bptr p,int t)//记录当前结点孩子的个数
    {
        if(p==NULL || found==3)return; 
    //如果是没有孩子,或者已经访问过就返回
        if(found==1) sum++;
    //如果结点访问次数为1,sum++ //意味着 搜索到一个孩子
        if(p->data==t) {found=1} //如果找到当前结点,
            child(p->Lson,t);//递归记录当前结点的左孩子个数
            child(p->Rson,t);//递归记录当前结点的右孩子个数
        if(p->data==t) found=3;
    // 访问次数为3 已经该子树已经访问结束。
    }
    

    交换两棵树的所有子树

    Bptr exchange(Bptr p)
    {
        Bptr x;
        if(!p) return 0;    //如果结点不存在,就返回
        x=p->Lson; //把左子树的指针给x
        p->Lson=p->Rson;//把右子树的指针给左子树
        p->Rson=x; //把x的指针给右子树  
        //实质就是把结点p的左右子树指针交换
        exchange(p->Lson); //递归交换下层左子树
        exchange(p->Rson); //递归交换下层右子树
    }   
    

    输出某一指定结点的真祖先

    void ancestor(Bptr p,int t) //输出某一指定结点的真祖先
    {
        if(p==NULL) return;//如果结点不存在,就返回
        if(p->data==t)  //如果找到指定结点
        {
            foundb=1; //访问标记置1
            return;
        }
        ancestor(p->Lson,t);//递归搜索左子树
        if(foundb==1)       //如果已经标记访问
        {
            printf("%d\n",p->data);
    //输出当前结点,因为当前结点是真祖先
            return;
        }
        ancestor(p->Rson,t) //递归搜索右子树
        if(foundb==1)       //如果已经标记访问
        {
            printf("%d\n",p->data);
    //输出当前结点,因为当前结点是真祖先
            return;
        }
    }
    

    删除单叶结点

    void delete(Bptr p) //删除单叶结点
    {
        if(p==NULL) return 0;
        if((p->Lson==NULL&&p->Rson!=NULL)|| 
        (p->Lson!=NULL&&p->Rson==NULL)) 
                return 1;
        //如果是单叶结点,则return 1
        if(delete(p->Lson)==1) p->Lson=NULL;
     //如果左子树返回1,则删除左子树
        if(delete(p->Rson)==1) p->Rson=NULL; 
    //如果右子树返回1,则删除右子树
    }
    

    括号表示法输出树结构

    void toot(Bptr p)   //输出树的结构的,用括号表示法
    {   
        if(p == NULL)  //如果p结点为空,则输出* 
        {
            printf("*");
            return;   
        }
        if(p ->Lson == NULL && p ->Lson == NULL)  //如果是单叶结点 
        {
            printf("%d", p -> data); //直接输出根结点值 ,返回
            return ;    
        }
        printf("%d(", p -> data);  //先输出结点值
        toot(p -> Lson);     //然后输出递归进行左子树
        printf(",");         
        toot(p -> Rson);    //递归进行右子树
        printf(")");
    }
    

    相关文章

      网友评论

          本文标题:树几个操作:

          本文链接:https://www.haomeiwen.com/subject/yjhutrtx.html