c++ - 为什么需要,在二叉树中添加一个节点需要一个参数;在链表中添加节点需要两个参数吗?(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);
}
所以,我的问题是为什么我们在二叉树中只需要一个参数(只有数据而不是根地址原因)和链表中的两个参数,即头引用和数据?为什么我们不为这两种数据结构编写相同类型的函数呢?提前谢谢你。
解决方案
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++ 资源中学习。
推荐阅读
- node.js - GithubAction 404 未找到 - 获取 https://registry.npmjs.org/Hexo
- vue.js - 具有多个页面的 vuejs
- yelp - 是否可以在 Web 应用程序中使用 yelp (OAuth) 登录?
- angular - 在 Fullcalendar 事件单击时显示带有可单击按钮的弹出框时出错?
- sql-server - SQL Server 静默安装不起作用 使用 InstallShield 2010
- linux - 如何在 Linux (Centos/Ubuntu) 中为所有网络适配器默认设置 DHCP
- reactjs - 使用 Cypress 进行 React 组件测试 - “类型”从何而来?
- firebase - 如何通过 Desc SwiftUI 对 Cloud Firestore 数据进行排序
- python-3.x - 报价水平数据 - 跳过值
- php - 在 symfony 2.8 中装饰兔子生产者