c++类内接口调用其它函数传递成员指针问题(以二叉树举例)

本文通过一个二叉查找树的实例,展示了如何在C++类中定义公有接口函数,这些接口函数调用私有函数来实现具体功能。在修改私有数据成员时,私有函数接受参数为引用,以确保能够正确修改。文中详细阐述了插入、删除和查找最小值的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        类中成员函数可以直接使用私有成员,实现类的某些功能。但有时为了更好地隐藏具体实现或使用方便,可定义不带全部参数参数的公有接口名,再由接口函数去调用带有参数的重载函数(也可以为非重载函数),此时前者常称为驱动,调用带参数的接口函数时若要修改类内的私有资源一定要传递引用。

这里举例说明函数参数传递(没有实现完整类):

二叉查找树的部分实现:类中三个公有函数都调用私有函数实现对应功能,当欲改变私有数据成员时私有函数的参数一定为引用,即使传递的是指针。

1.节点(节点内元素为int型).

struct node{

  int item;

  node *left;

  node *right;};

2.二叉查找树类实现:

class binarysearchtree{

  private:

      node *root=nullptr;//二叉树基本的私有成员—根节点

      //...其他成员可根据实现定义

  public:

      binarysearchtree(){};

       //...这里还有很多成员如复制构造、打印等,可根据实际需要进行定义

      void  insert(const node &);

      void  remove(const node &);

      int findmin();

  private:

      int findmin(const node *);//int findmin()函数的重载

      void insert(node *&root,const node &nod);//void insert()成员的重载

      void remove(node *&root, const node &nod);//void remove()成员的重载

       };

 int binarysearchtree::findmin()

{

 return findmin(root);

}

int binarysearchtree::findmin(const node *root)

{

 if(root==nullptr)//如果树为空则无最小值,返回INT_MIN作为标记

  return INT_MIN; 

if(root->left!=nullptr)

  findmin(root->left);

 else return root->item;

}

 void  binarysearchtree::insert(const node &nod)

{

 insert(root ,nod);

}

void binarysearchtree:: remove(const node &nod)

{

 remove(root, nod);

}

void binarysearchtree::insert(node * &root, const node &nod)

{

  if(nullptr==root)

     {

       root=new node;

       root.item=nod.item;

       return ;

     }

  if(root->item>nod.item)//插入元素小于节点元素,向节点的左子树插入

    insert(root->left,nod);

 else if(root->item<nod.item)//插入元素大于节点元素

     insert(root->right, nod);

 else if(root->item==nod.item)//等于则不需插入

     return;

}

void binarysearchtree::remove(node *&root,const node &nod )

{

   if(nullptr==root)//对象中无元素

     return ;

   if(root->item>nod.item)

     remove(item->left,nod);

  else if(root->item<nod.item)

    remove(item->right, nod);

  else if(root->item==nod.item)

     {

           node *temp=root;

        if(root->left!=nullptr&&root->right!=nullptr)

//欲删除节点有左右子节点时将节点删除,并将右子树中最小节点移过来再删除右子树最小点(也可以移动左子树最大节点)

             {

               root->item=findmin(root->right);

               remove(root->right,*root);

              }

         else  if(root->left!=nullptr)//只有一个节点则用子节点替换父节点

             {

                root->right=right->left->right;//此句与下局顺序不可变

                root->left=root->left->left;

             }

         else if(root->right!=nullptr)

            {

               root->left=root->right->left;

               root->right=root->right->right;

             }

         delete temp;

     }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值