C++ 从文件中读取二叉树
我一直在处理来自文件的输入,认为我的逻辑正确,但我的节点没有正确链接。我能够正确设置根,程序能够遍历字符串并正确加载节点,只是不链接它们。有人能帮我理清逻辑,找出问题所在吗 输入字符串是(A(B(dg)E)(C()F))C++ 从文件中读取二叉树,c++,recursion,file-upload,tree,binary-tree,C++,Recursion,File Upload,Tree,Binary Tree,我一直在处理来自文件的输入,认为我的逻辑正确,但我的节点没有正确链接。我能够正确设置根,程序能够遍历字符串并正确加载节点,只是不链接它们。有人能帮我理清逻辑,找出问题所在吗 输入字符串是(A(B(dg)E)(C()F)) struct节点 { 字符串数据; 节点*左; 节点*右; }; void tree::build_tree(字符串和输入,int i,node*n) { 如果(i>input.length()) 返回*n=NULL; 如果(输入[i]=='(') { 字符串数据; int p
struct节点
{
字符串数据;
节点*左;
节点*右;
};
void tree::build_tree(字符串和输入,int i,node*n)
{
如果(i>input.length())
返回*n=NULL;
如果(输入[i]=='(')
{
字符串数据;
int prev_i=i;
//get_数据检索标识符
数据=获取数据(输入、温度、i+1);
//get_data_num检索字符串中的新位置
i=获取数据数量(输入、温度、i+1);
如果(输入[prev_i]='('&&input[i]='))
{
i+=1;
*n=零;
}
其他的
{
//分配一个新节点并分配数据和
//将指向分支的指针设置为null
*n=新节点;
(*n)->数据=数据;
(*n)->left=NULL;
(*n)->right=NULL;
如果(输入[i]='')
{i+=1;}
//传递节点的地址
构建树(输入、i和(*n)->左);
构建_树(输入、i和(*n)->右侧);
}
}
else if(isalnum(输入[i])| |输入[i]='| | |输入[i]='-')
{
字符串数据;
int prev_i=i;
数据=获取数据(输入、温度、i);
i=获取数据数量(输入、温度、i);
如果(输入[prev_i]='('&&input[i]='))
{
i+=1;
*n=零;
}
其他的
{
*n=新节点;
(*n)->数据=数据;
(*n)->left=NULL;
(*n)->right=NULL;
如果(输入[i]='')
{i+=1;}
构建_树(输入,i,&(*n)->左);
构建_树(输入,i,&(*n)->右);
}
}
else if(输入[i]='')
{
i+=1;
}
else if(输入[i]=')')
{
i+=1;
*n=零;
}
其他的
{
cout我认为问题在于您没有设置左指针和右指针的值。您正在传递指针的值。您需要传递指向指针(左指针和右指针)的指针,以设置结构中的值。另一种选择是使用引用而不是指针
以下是我为您提供的代码所做的修改:
- 将节点参数的build_tree调用更改为指向
指针
- 相应地更改了值的分配
- 更改了对build_tree的调用,以将左侧和右侧的地址传递给
获取指向指针的指针)
- 删除分配/条件以设置根节点。因此
调用需要传入root地址的build_树
将像后面的所有节点一样设置节点,因此不需要
作为特例
- 添加了在没有空值的情况下为左侧和右侧分配NULL
branch(可能不需要这样做,但我觉得这样做是很好的做法
确保所有项目都有一些初始值)
void树::构建树(字符串和输入,int i,节点**n)
{
如果(输入[i]=='(')
{
字符串数据;
//get_数据检索标识符
数据=获取数据(输入、温度、i+1);
//get_data_num检索字符串中的新位置
i=获取数据数量(输入、温度、i+1);
//分配一个新节点并分配数据和
//将指向分支的指针设置为null
*n=新节点;
(*n)->数据=数据;
(*n)->left=NULL;
(*n)->right=NULL;
如果(输入[i]='')
{i+=1;}
//传递节点的地址
构建树(输入、i和(*n)->左);
构建_树(输入、i和(*n)->右侧);
}
else if(isalnum(输入[i])| |输入[i]='| | |输入[i]='-')
{
字符串数据;
数据=获取数据(输入、温度、i);
i=获取数据数量(输入、温度、i);
*n=新节点;
(*n)->数据=数据;
(*n)->left=NULL;
(*n)->right=NULL;
如果(输入[i+1]='')
{i+=1;}
构建_树(输入,i,&(*n)->左);
构建_树(输入,i,&(*n)->右);
}
else if(输入[i]='')
{
i+=1;
}
else if(输入[i]=')')
{
*n=零;
}
其他的
{
cout参数i
应该是一个引用。否则,两个连续的递归调用(解析左侧和右侧的子节点)将在相同的位置读取!只需在参数列表中尝试int&i
,无其他更改,然后报告结果。@Leems我尝试了,但仍然得到相同的结果。请发布您的节点结构。这可能有助于理解问题。@Glenn好的,我已经发布了。@user2057191谢谢。这非常有用。我支持我在下面给出了一个答案,因为它不适合在评论中。非常感谢!这解决了我让节点连接的问题。我只需要做一些小的调整来适应我的更新代码。我刚刚再次测试了它,只有左侧节点正在设置。有什么想法吗?我必须稍后查看并与您联系。希望我会有一个answer。谢谢。我怀疑在解析和赋值中有什么不正确的地方,是在生成左节点,而不是右节点。另一个问题是在之后(需要一个数据值。但是在您的示例中,您有一个()这表示没有数据值。我想对树的外观进行更多的解释。例如(a(B(dgge)(C()F),这是否意味着顶部节点上没有数据值,或者输入格式不正确?我可能有一些有用的东西,但我可以使用附加信息。感谢帮助。我最终解决了问题。这是函数如何在字符串中移动的问题,只需要一些if语句来更正。
struct node
{
string data;
node* left;
node* right;
};
void tree::build_tree(string &input, int i, node *n)
{
if(i > input.length())
return *n = NULL;
if(input[i] == '(')
{
string data; string temp;
int prev_i = i;
//get_data retrieves the identifier
data = get_data(input, temp, i+1);
//get_data_num retrieves the new position in the string
i = get_data_num(input, temp, i+1);
if(input[prev_i] == '('&& input[i] == ')')
{
i += 1;
*n = NULL;
}
else
{
// Allocate a new node and assign the data and
// set the pointer to the branches to null
*n = new node;
(*n)->data = data;
(*n)->left = NULL;
(*n)->right = NULL;
if(input[i] == ' ')
{i += 1; }
//Pass the address of the nodes
build_tree(input, i, &(*n)->left);
build_tree(input, i, &(*n)->right);
}
}
else if(isalnum(input[i]) || input[i] == '_' || input[i] == '-')
{
string data; string temp;
int prev_i = i;
data = get_data(input, temp, i);
i = get_data_num(input, temp, i);
if(input[prev_i] == '('&& input[i] == ')')
{
i += 1;
*n = NULL;
}
else
{
*n = new node;
(*n)->data = data;
(*n)->left = NULL;
(*n)->right = NULL;
if(input[i] == ' ')
{ i += 1; }
build_tree(input, i, &((*n)->left));
build_tree(input, i, &((*n)->right));
}
}
else if(input[i] == ' ')
{
i += 1;
}
else if(input[i] == ')')
{
i += 1;
*n = NULL;
}
else
{
cout << "The input tree is not in the correct format!" << endl;
}
}