1

我已经看到很多实现 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());
    }
}

通过创建类节点{}并将左、右、数据保留为私有成员,我是否做得太多并使事情变得复杂,或者这是一个好方法???

4

2 回答 2

1

BST 虽然在某些方面非常复杂,但实际上非常简单。你在做什么 - 除非绝对需要,否则将所有内容设置为私有 - 是很好的 OOP 约定,但在这里并不是必需的。你有一个单一的类——这意味着继承和多态是无关的——它基本上用于一个单一的、非常简单的目的,这意味着限制访问并没有多大作用(你的代码不太可能被其他人使用谁决定任意弄乱不该弄乱的字段)。

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

于 2013-06-26T17:22:47.953 回答
0

一般来说,如果您要构建的结构只是保存数据(并且不需要直接更改或访问数据),那么您不需要类。这就是为什么在 BST 中,当已经有 Tree 类时,一个结构体就足够了。

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

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

希望这会有所帮助,祝编程好运:)

于 2013-06-26T18:03:47.400 回答