【问题标题】:Binary Tree Traversal (Mostly) Failing二叉树遍历(大部分)失败
【发布时间】:2015-05-01 16:21:58
【问题描述】:

对于类,我必须创建一个状态对象的二叉树,每个状态对象都包含一个常驻对象的二叉树,用于组织居住在每个状态中的人。我正在尝试按姓名搜索整个州的树(州和常驻树都按名称的字母顺序组织),这涉及遍历整个州树并在每个州的常驻树中搜索该人。显然,我的状态树遍历不起作用,因为大多数时候,当我知道他们确实存在时,它会告诉我该人不在数据库中(即我的 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 <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;
    }

【问题讨论】:

  • 所以没有提供州名?你只需要搜索每个状态树?
  • 是的。教授知道我知道如何寻找状态;现在他正在测试我们是否可以在树中搜索树,并处理不一定需要特定顺序的遍历。

标签: c++ tree binary-tree tree-traversal


【解决方案1】:

我相信正在发生的事情是您只探索左侧节点。永远不要走正确,因为你之前回来了:

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

比对变量进行任何检查以返回正确的变量。

(我认为这至少是问题所在。有一段时间没有进行任何递归编程,所以我可能会误会。)

【讨论】:

  • 看起来没有错,因为从左边一直遍历调用树最终会返回一个左边的人,或者NULL
  • 是的,一个左撇子。但他从未真正检查过树的任何正确部分。如此现实地,他正在探索他的树的 30%。所以当然没有找到他需要的人。在某些情况下,他会。如果此人在左分支。
  • 就是这样——我需要它来中断遍历,仅当在当前访问的状态中找到所给的人的名字时才返回;否则,继续前进。如果搜索了树的两半,但仍然没有找到此人,那么我只想返回NULL。所以我真的不知道如何让它左右搜索,只有当这个人在其中一个州被发现时才返回。那有意义吗?换句话说,我什至不知道我会对left_retright_ret 进行哪些检查。这种递归对我来说毫无意义。
  • 是的。但正如我所说,尝试存储你的变量而不是立即返回。类似return ((left_ret != 0 ? left_ret : right_ret)); 如果我理解正确的话。
  • @Khaldor 见上文:我添加了尝试的更新,但它仍然只在某些时候有效,并且在其他时候给我留下了段错误(包括我故意搜索我认识的人的情况)数据库中没有。)
猜你喜欢
  • 2012-01-01
  • 2022-11-11
  • 2018-09-19
  • 1970-01-01
  • 2021-11-20
  • 2021-03-08
  • 2020-01-15
  • 1970-01-01
相关资源
最近更新 更多