Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从文件中读取二叉树_C++_Recursion_File Upload_Tree_Binary Tree - Fatal编程技术网

C++ 从文件中读取二叉树

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

我一直在处理来自文件的输入,认为我的逻辑正确,但我的节点没有正确链接。我能够正确设置根,程序能够遍历字符串并正确加载节点,只是不链接它们。有人能帮我理清逻辑,找出问题所在吗

输入字符串是(A(B(dg)E)(C()F))

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