首页 > 解决方案 > 为什么需要,在二叉树中添加一个节点需要一个参数;在链表中添加节点需要两个参数吗?(C++)

问题描述

所以作为一个编程新手,我正在尝试学习数据结构,当我在研究二叉树时,我想到了一个问题。所以将节点添加到二叉树的代码/函数是://二叉树节点添加

 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);
}

所以,我的问题是为什么我们在二叉树中只需要一个参数(只有数据而不是根地址原因)和链表中的两个参数,即头引用和数据?为什么我们不为这两种数据结构编写相同类型的函数呢?提前谢谢你。

标签: c++data-structureslinked-listbinary-tree

解决方案


TLDR它们是写得很糟糕的函数。

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

你的代码有很多问题:

  • addnode实际上并没有将节点添加到列表中。它只是创建一个节点。这就是为什么它需要一个论点。

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

  • 您在任何地方都使用拥有原始指针,因此没有明确的new. 即使您明确delete指出节点,您的代码也会在第一个异常时泄漏。这就是为什么您需要虔诚地遵循C++ 中的RAII 概念

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

  • 结构尽可能以最简约的方式使用,仅使用 C 语言。在 C++(真正的 C++)中,您将使用构造函数、封装、方法等。

到目前为止,这不是惯用的正确 C++ 代码。它是 C 代码(带有 C++ IO)并使用 C++ 编译器编译。如果这是你的老师所要求的,那么一定要为他/她写这个让他们开心,但要注意,这绝对不是你编写正确、干净、惯用的现代 C++ 代码的方式。如果您从教程或书籍中学习到这一点,请立即放弃它并从良好的 C++ 资源中学习。


推荐阅读