二叉树遍历(主要)失败

时间:2015-05-01 16:21:59

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

对于类,我必须创建一个状态对象的二叉树,每个状态对象都包含一个驻留对象的二叉树,用于组织生活在每个状态的人。我试图通过名称搜索一个人的整个状态树(状态和常驻树按名称按字母顺序排列),这涉及遍历整个状态树并搜索每个状态的常驻树说的人。很明显,我的状态树遍历并不起作用,因为大多数时候,当我知道他们知道这个事实时,它告诉我这个人不在数据库中(即我的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;
    }

1 个答案:

答案 0 :(得分:4)

我相信发生的事情是你只探索左边的节点。永远不要因为你之前回来而去:

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

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

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