我们为什么需要,在二叉树中添加节点时需要一个参数;在链表中添加节点时需要两个参数?(C ++)

问题描述 投票:-2回答:2

因此,作为一个新手编程人员,我试图学习数据结构,而在研究二叉树时,我想到了一个问题。因此,将节点添加到二叉树的代码/函数是://添加二叉树节点

 struct tree* addnode(int rdata)
{
    struct tree* temp = new tree();
    temp->data = rdata;
    temp->right = NULL;
    temp->left = NULL;
    return temp;
}

在这里,我们看到添加节点仅需要一个参数,即,我们没有在函数中传递根地址。但是除了链表之外,节点的添加在任何地方(k个节点的开始,结束或之后)都有两个参数,它们是链表的headref指针和数据值。在链表的开头添加节点的类似代码是:

    void addatstartLL(struct LL** headref, int rdata) {
    struct LL* temp = new LL();
    temp->data = rdata;
    temp->next = (*headref);
    (*headref) = temp;
}

以上两个代码的用法如下:

#include<iostream>
using namespace std;
struct LL {
    int data;
    struct LL* next;
};

struct tree {
    int data;
    struct tree* left;
    struct tree* right;
};
int main()
{
struct tree* root = new tree();
    root->data = 1;
    root->left=addnode(2);
    struct LL* head = NULL;
    addatstartLL(&head, 2);
}

所以,我的问题在这里,为什么我们只需要二进制树中的一个参数(仅数据而不是根地址)和链表中的两个参数,即headref和data?为什么我们不为两种数据结构编写相同类型的函数?谢谢你。

c++ data-structures linked-list binary-tree
2个回答
3
投票

这些功能就是您要成为的功能。如果您让一个接受一个参数,而另一个接受两个参数,那么就是这样。它们不是标准函数,也不是编写良好的函数(就接口和实现而言)。

您的代码有很多问题:

  • addnode实际上并未将节点添加到列表中。它只是创建一个节点。这就是为什么需要一个参数的原因。

  • LL结构不代表链接列表。它代表一个节点。

  • 您到处都使用原始指针,因此new分配的内存没有明确的所有者。即使您显式delete节点,您的代码也会在第一个异常处泄漏。这就是为什么您需要认真遵循C ++中的RAII

  • struct tree* root = new tree();绝对没有理由在main中动态分配树。 tree root{}就足够了。

  • 您不使用OOP(带有封装和所有口哨)。

到目前为止,这不是惯用的正确C ++代码。它是C代码(带有C ++ IO)并使用C ++编译器进行编译。如果这是您的老师所需要的,那么请务必为他/她写这个,以使他们感到高兴,但请注意,这绝对不是您编写正确,整洁,惯用的C ++代码的方式。


2
投票

您的第一个功能不会将节点添加到树中。它创建新树]的一个节点。

一旦确定要添加节点的位置,就可以通过将节点添加到树的功能使用

。>>

您的第二个功能是将节点添加到列表中的特定位置。可比的树函数为

void addnodebefore(tree** root, int rdata)
{
    tree* temp = new tree();
    temp->data = rdata;
    temp->right = *root;
    temp->left = nullptr;
    *root = temp;
}

void addnodeafter(tree** root, int rdata)
{
    tree* temp = new tree();
    temp->data = rdata;
    temp->right = nullptr;
    temp->left = *root;
    *root = temp;
}
        
© www.soinside.com 2019 - 2024. All rights reserved.