C++ 我的代码是以正确的方式使用OOPS概念,还是让它变得不必要的复杂?

C++ 我的代码是以正确的方式使用OOPS概念,还是让它变得不必要的复杂?,c++,oop,binary-search-tree,C++,Oop,Binary Search Tree,我看过很多实现BST的代码(在线和一些书中)。这些代码中的大多数都有如下结构:- struct node{ int data; struct node *left; struct node *right; }; class tree{ private: node *root; public: //other helper function like insert,delete,display }; 但是

我看过很多实现BST的代码(在线和一些书中)。这些代码中的大多数都有如下结构:-

struct node{
     int data;
     struct node *left;
     struct node *right;
};

class tree{
      private:
           node *root;
      public:
       //other helper function like insert,delete,display
};
但是如果我想以更好的方式使用OOPS,那么说我应该创建类节点{}是正确的吗;而不是使用struct

我已经编写了下面的代码,据我所知,它以更好的方式使用了OOPS概念。 如果您发现设计存在问题,请建议我进行任何更改:-

我的代码:-

#include<iostream>
using namespace std;

class node{

    private:
        int data;
        node *left;
        node *right;
    public:
        node()
        {
            data=0;
            left=NULL;
            right=NULL;
        }
        node(int val)
        {
            data=val;
            left=NULL;
            right=NULL;
        }
        int getData()
        {
            return data;
        }

        node* getLeft()
        {
            return left;
        }
        node* getRight()
                {
                        return right;
                }
        void setData(int val)
        {
            data=val;
        }
        void setLeft(node *l)
        {
            left=l;
        }
        void setRight(node *r)
                {
                        right=r;
                }


};


class tree{
    private:
        node *root;
        node *insertHelper(node*,int);
        void inorderHelper(node*);
    public:
        tree()
        {
            root=NULL;
        }

        void insert(int val)
        {

            if(root==NULL)
            {
                root=new node(val);
                return;
            }
            insertHelper(root,val);
        }
        void inorder();


};

node *tree::insertHelper(node *root,int val)
{
    if(root==NULL)
    {
        root=new node(val);
        return root;
    }
        else
        {
        if(root->getData() > val)
                {
            root->setLeft(insertHelper(root->getLeft(),val));
                }
                else
        {
            root->setRight(insertHelper(root->getRight(),val));
        }
    }
}



void tree::inorder()
{
    if(root)
    {
        inorderHelper(root);
    }
}
void tree::inorderHelper(node *temp)
{
    if(temp!=NULL)
    {
        inorderHelper(temp->getLeft());
        cout<<temp->getData()<<" ";
        inorderHelper(temp->getRight());
    }
}
#包括
使用名称空间std;
类节点{
私人:
int数据;
节点*左;
节点*右;
公众:
节点()
{
数据=0;
左=空;
右=空;
}
节点(int-val)
{
数据=val;
左=空;
右=空;
}
int getData()
{
返回数据;
}
节点*getLeft()
{
左转;
}
节点*getRight()
{
返还权;
}
无效设置数据(int val)
{
数据=val;
}
void setLeft(节点*l)
{
左=l;
}
void setRight(节点*r)
{
右=r;
}
};
类树{
私人:
节点*根;
节点*插入帮助器(节点*,int);
void inorderHelper(node*);
公众:
树()
{
root=NULL;
}
无效插入(int val)
{
if(root==NULL)
{
根=新节点(val);
返回;
}
插入帮助器(根,瓦尔);
}
无效顺序();
};
节点*树::insertHelper(节点*根,int val)
{
if(root==NULL)
{
根=新节点(val);
返回根;
}
其他的
{
if(root->getData()>val)
{
root->setLeft(insertHelper(root->getLeft(),val));
}
其他的
{
root->setRight(insertHelper(root->getRight(),val));
}
}
}
无效树::索引()
{
如果(根)
{
inorderHelper(根);
}
}
void树::inorderHelper(节点*temp)
{
如果(温度!=NULL)
{
inorderHelper(temp->getLeft());

coutBST虽然在某些方面非常复杂,但实际上非常简单。您所做的是——将所有内容设置为私有,除非绝对需要其他设置——是良好的OOP约定,但在这里并不是真正必要的。您只有一个类——这意味着继承和多态性是不相关的——基本上用于一个单独的版本这意味着限制访问实际上并没有多大作用(你的代码不太可能被其他人使用,因为他们决定任意乱处理不应该乱处理的字段)


通过使结构成为类,您不会失去任何功能,但也不会真正获得任何功能。如果以后您甚至有计划以某种方式使用经过修改的BST,请务必使用类,因为继承将变得相关;但如果没有,则类和结构之间没有太大区别,除了样式之外。

BST虽然在某些方面非常复杂,但实际上非常简单。您正在做的事情——将所有内容设置为私有,除非绝对需要其他设置——是良好的OOP约定,但在这里并不是真正必要的。您只有一个类——这意味着继承和多态性无关——用于basica这是一个非常简单的目的,这意味着限制访问实际上并没有多大作用(你的代码不太可能被其他人使用,他们决定任意地弄乱不应该弄乱的字段)


通过使结构成为类,您不会失去任何功能,但也不会真正获得任何功能。如果以后您甚至有计划以某种方式使用经过修改的BST,请务必使用类,因为继承将变得相关;但如果没有,则类和结构之间没有太大区别,除了样式之外。

一般来说,如果要创建的构造只保存数据(不需要直接更改或访问数据),那么就不需要类。这就是为什么使用BST时,当已经存在树类时,结构就足以满足节点的需要

但是,为什么节点的结构就足够了?这可以归结为一个事实,即您不需要在“节点”中提供方法类有两个原因。首先,节点类中的方法正在完成的任何操作都有些不必要;树类已经负责遍历BST、添加新节点、删除不需要的节点和获取数据(您通常不希望使用mutator函数在添加节点后更改节点中存储的值,因为这可能导致BST不符合BST所需的结构)其次,正如上面所述,节点只需要保存数据。这在C++中引入了一个重要的范例,它是一个关键的区别,它使它与其他有对象的语言不同:它允许我们在绝对必要的时候才制作类(例如java,所有的东西都是一个类!)。因此,我们应该利用这一点,在不需要类的情况下使用结构。根据我的经验,类越少,代码越容易编写,也越容易让其他人理解

关于在您定义的类中将节点结构的成员变量设置为私有:这是数据封装的好主意,可以防止发生意外,但在编写BST时请务必小心,应该不会有问题

希望这对你有帮助,祝你好运