C++ 二叉树遍历(大部分)失败

C++ 二叉树遍历(大部分)失败,c++,tree,binary-tree,tree-traversal,C++,Tree,Binary Tree,Tree Traversal,对于类,我必须创建一个状态对象的二叉树,每个状态对象都包含一个常驻对象的二叉树,用于组织居住在每个状态中的人。我试图通过姓名搜索整个州树中的一个人(州树和居民树都是按姓名字母顺序排列的),这涉及到遍历整个州树并搜索每个州的居民树中的此人。很明显,我的状态树遍历不起作用,因为在大多数情况下,当我知道数据库中确实存在此人时,它会告诉我此人不在数据库中(即下面列出的树的stateforperson方法返回NULL)。我确信我的searchfor()方法是有效的 node <Person*>

对于类,我必须创建一个状态对象的二叉树,每个状态对象都包含一个常驻对象的二叉树,用于组织居住在每个状态中的人。我试图通过姓名搜索整个州树中的一个人(州树和居民树都是按姓名字母顺序排列的),这涉及到遍历整个州树并搜索每个州的居民树中的此人。很明显,我的状态树遍历不起作用,因为在大多数情况下,当我知道数据库中确实存在此人时,它会告诉我此人不在数据库中(即下面列出的树的stateforperson方法返回NULL)。我确信我的searchfor()方法是有效的

node <Person*> * stateforperson (string nm, node <T> * n)
{    if (n !=  NULL)
     {
         node <Person*> * person = n->data->residents->searchfor(nm);
         if (person != NULL)
             return person;
         return stateforperson(nm, n->left);
         return stateforperson(nm, n->right);
     }
     else
         return NULL;
}
node*stateforperson(字符串nm,node*n)
{如果(n!=NULL)
{
节点*person=n->数据->居民->搜索(nm);
if(person!=NULL)
返回人;
人员返回状态(nm,n->左侧);
人员返回状态(nm,n->右侧);
}
其他的
返回NULL;
}
尝试的更新:

node <Person*> * stateforperson (string nm, node <T> * n)
{        if (n !=  NULL)
         {
             node <Person*> * person = n->data->residents->searchfor(nm);
             if (person != NULL)
                 return person;
             // Here, you explore the left branch and get the results.
             node <Person*> * left_ret = stateforperson(nm, n->left);
             // Here, same with right branch.
             node <Person*> * right_ret = stateforperson(nm, n->right);
             // You now have both results.
             if (left_ret != NULL) // If a result was found in left branches, you return that person. 
                 return left_ret;
             else if (right_ret != NULL) // Same with right branch.
                 return right_ret;
             else // The problem was here. Before you returned uninitialized memory. (because there wasn't a specified return value.
             // Now, you return a NULL pointer if nothing was found. 
             //So you detect that no person was found and don't use unitialized memeory.
                 return (NULL);
              }
              else
                  return NULL;
    }
node*stateforperson(字符串nm,node*n)
{如果(n!=NULL)
{
节点*person=n->数据->居民->搜索(nm);
if(person!=NULL)
返回人;
//在这里,您将探索左分支并获得结果。
节点*left_ret=stateforperson(nm,n->left);
//这里,右分支也一样。
node*right\u ret=stateforperson(nm,n->right);
//现在,两种结果都有了。
if(left_ret!=NULL)//如果在左分支中找到一个结果,则返回此人。
向左返回;
else if(right_ret!=NULL)//与右分支相同。
返回权(ret);;
else//问题就在这里。在返回未初始化的内存之前。(因为没有指定的返回值。)。
//现在,如果没有找到任何内容,则返回空指针。
//因此,您检测到未找到任何人,并且不使用统一化的Memory。
返回(空);
}
其他的
返回NULL;
}

我相信现在的情况是,你只探索左边的节点。永远不要向右走,因为你在返回之前:

     return stateforperson(nm, n->left); 
     // Here you just return the left part. Never reaching the following line
     return stateforperson(nm, n->right);
尝试实际存储值和类似的内容:

    left_ret = stateforperson(nm, n->left);
    right_ret = stateforperson(nm, n->right);
而不是对变量进行任何需要的检查以返回正确的变量


(我认为这至少是个问题。有一段时间没有做任何递归编程,所以我可能会弄错。)

我认为现在发生的事情是,您只探索左边的节点。永远不要向右走,因为您以前返回过:

     return stateforperson(nm, n->left); 
     // Here you just return the left part. Never reaching the following line
     return stateforperson(nm, n->right);
尝试实际存储值和类似的内容:

    left_ret = stateforperson(nm, n->left);
    right_ret = stateforperson(nm, n->right);
而不是对变量进行任何需要的检查以返回正确的变量


(我认为这至少是个问题。我有一段时间没有做任何递归编程,所以我可能会弄错。)

所以没有提供州名?你只需要搜索每棵州树?是的。教授知道如何搜索州;现在他正在测试我们是否可以搜索树内的树,并处理不一定需要特定顺序的遍历。所以没有提供州名?你只需要搜索每棵州树?是的rofessor知道我知道如何搜索一个状态;现在他正在测试我们是否可以搜索树中的树,并处理不一定需要特定顺序的遍历。这看起来不像是一个错误,因为遍历调用树一直到左边最终会返回一个左撇子,或者
NULL
Yes,一个左撇子但是他从来没有真正检查过树的任何右侧部分。所以现实地说,他在探索树的30%。所以,当然,他找不到他需要的人。在某些情况下,他会的。如果这个人在左边的树枝上。这就是问题——我需要它来打破遍历,只有当在州陈述中找到给出的人的名字时才返回y被访问;否则,继续前进。如果树的两半都被搜索了,但仍然没有找到那个人,那么我才想返回
NULL
。所以我真的不知道如何使它同时搜索左右,并且只在发现该人处于某个状态时返回。这有意义吗?换句话说,我甚至不知道知道我会在
left_-ret
right_-ret
上做什么检查。这种递归对我来说毫无意义。是的。但正如我所说,尝试存储变量,不要立即返回。类似
的返回((left_-ret!=0?left_-ret:right_-ret))
如果我理解正确。@Khaldor请参见上文:我添加了尝试的更新,它只在部分时间有效,而在其他时间会留下seg故障(包括我故意搜索数据库中不存在的我认识的人的情况)这看起来并不是一个错误,因为沿着调用树一直向左遍历最终会返回一个左边的人,或者
NULL
是的,一个左边的人。但是他从来没有检查过树的任何右边部分。所以现实地说,他在探索树的30%。因此,当然,他没有找到他需要的人。在某些情况下,他会。如果person位于左分支中。这就是问题所在——我需要它中断遍历以仅在当前访问的状态中找到给定的person的名称时返回;否则,继续前进。如果搜索了树的两半部分,但仍然没有找到person,则我只想返回
NULL
。所以我真的不确定现在,如何让它同时搜索左侧和右侧,并且只在发现某人处于某个状态时返回。这有意义吗?换句话说,我甚至不知道我将在
left\u ret
right\u ret
上执行什么检查。这种递归对我来说没有意义。是的。但是正如我所说的,请尝试存储