使用递归时不将节点写入树的函数

Function not writing nodes to tree when using recursion

本文关键字:函数 节点 递归      更新时间:2023-10-16

我是一名学生,正在为一个项目制作 cpp 树结构。该程序应该从输入中获取一个字符串并将其输入到树中。树由每个节点组织,每个节点具有指向其下一个同级(称为同级(和第一个子级(称为子级(的指针。但是,当我尝试创建一个递归将成员添加到树的函数时,该函数不起作用。所有的必要步骤都已完成,但由于某种原因,节点没有链接。请看一下我的代码,感谢您的阅读。

#include <iostream>
#include <string>
struct node{
char data;
node *sibling = nullptr;
node *child = nullptr;
};
struct node* newNode(char data, unsigned int m)
{
if(m!=0) {
struct node *node = (struct node *) malloc(sizeof(struct node));
// std::cout << "node write" << std::endl;
node->data = data;
node->sibling = newNode(124,m-1);
node->child = newNode(124,m-1);
return (node);
}
}
char TreeOutput(node *n){
return *(char *)n;
}
void nodeAdd(node *currentNode, std::string str, int m ){
int n = str.length();
if(m<n){
if(TreeOutput(currentNode) == str[m]){
std::cout << m << "1..1" << std::endl;
nodeAdd(currentNode->child,str,m+1);
}
else if(TreeOutput(currentNode) == 124){
std::cout << m <<  "2..2" << std::endl;
currentNode = newNode(str[m],2);
nodeAdd(currentNode->child,str,m+1);
}
else{
std::cout << m << "3..3" << std::endl;
nodeAdd(currentNode->sibling,str,m+1);
}
}
}
int main() {
struct node *root = newNode('X',6);
std::cout << root->data << std::endl;
nodeAdd(root->child,"APE",0);
std::cout << root << std::endl;
return 0;
}

他们没有在这一行中链接的原因:

currentNode = newNode(str[m],2);

这是因为您将节点*带到函数,然后为函数内的指针分配一个新值。 因此,您可以在函数中更改当前节点的值,但不在其父函数中更改。 您需要引用指针或双指针才能正常工作:

void nodeAdd(node*& currentNode, std::string str, int m )

如果我们删除指针的语法糖,可能会更有意义。 想象一下,如果我们写Ptr<node>指向节点的指针:

void nodeAdd(Ptr<node> currentNode, std::string str, int m )

很明显,我们按值获取指针,因此它现在位于函数内的变量中。 如果我们通过引用来获取它,我们可以在函数外部更改它的值:

void nodeAdd(Ptr<node>& currentNode, std::string str, int m )

切向地,您的节点结构中有 char 数据,我认为您也希望那里有一个指针(或数组(。

就一般风格而言,如果您尝试编写C++,通常 newNode 的内容会放在构造函数中,因此您只需编写new node(args...)即可创建新实例。 由于节点的布局简单,TreeOutput 函数在这种情况下将起作用,但一般来说,强制转换为结构的第一个成员不必工作(特别是在继承或虚拟方法的情况下(,所以我至少可以直接访问成员return node->data;