因此,作为一个新手编程人员,我试图学习数据结构,而在研究二叉树时,我想到了一个问题。因此,将节点添加到二叉树的代码/函数是://添加二叉树节点
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?为什么我们不为两种数据结构编写相同类型的函数?谢谢你。
这些功能就是您要成为的功能。如果您让一个接受一个参数,而另一个接受两个参数,那么就是这样。它们不是标准函数,也不是编写良好的函数(就接口和实现而言)。
您的代码有很多问题:
addnode
实际上并未将节点添加到列表中。它只是创建一个节点。这就是为什么需要一个参数的原因。
LL
结构不代表链接列表。它代表一个节点。
您到处都使用原始指针,因此new
分配的内存没有明确的所有者。即使您显式delete
节点,您的代码也会在第一个异常处泄漏。这就是为什么您需要认真遵循C ++中的RAII。
struct tree* root = new tree();
绝对没有理由在main中动态分配树。 tree root{}
就足够了。
您不使用OOP(带有封装和所有口哨)。
到目前为止,这不是惯用的正确C ++代码。它是C代码(带有C ++ IO)并使用C ++编译器进行编译。如果这是您的老师所需要的,那么请务必为他/她写这个,以使他们感到高兴,但请注意,这绝对不是您编写正确,整洁,惯用的C ++代码的方式。
您的第一个功能不会将节点添加到树中。它创建新树]的一个节点。
一旦确定要添加节点的位置,就可以通过将节点添加到树的功能使用
。>>您的第二个功能是将节点添加到列表中的特定位置。可比的树函数为
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;
}