C ++通过路径在树中查找

时间:2014-08-26 04:03:53

标签: c++ recursion

我想在树中找到一个节点(Frame-object)。我有路径作为字符串和根路径(父)作为输入参数,这是我的代码:

  Frame* TryFindFrame(const char* framePath, const Frame* pParentFrame)
  {
    const Frame* pResult = NULL;
    foreach(const Frame* pChildFrame, pParentFrame->ChildFrames)
    {
          if(pChildFrame->HasPath)
          {
            LPCTSTR framePathObj = NULL;
            pChildFrame->GetPath(&framePathObj);
            if(framePathObj != NULL)
            {
              // found it
              if(strcmp(framePathObj, framePath) == 0)  
              {
                pResult = pChildFrame;
                break;
              }
              else
              {
                pResult = TryFindFrame(framePath, pChildFrame);
              }

            }
          } 

    }
    return pResult;
  }

问题是,当路径较长时,函数返回NULL,然后在找到路径后再执行2个元素,如“my :: test :: path”,导致执行另一个递归,并将pResult指定为NULL。

当我通过路径找到帧时,如何结束递归?

1 个答案:

答案 0 :(得分:0)

您的代码甚至编译时有点奇怪,因为您在返回时会隐式地将const Frame* pResult转换为Frame*

此算法也远非最佳。您可以仅在帧中存储与该帧对应的路径的一部分。然后在搜索时将路径拆分为多个部分,并再次检查部分节点值,这样就不必遍历不需要的子树。

无论如何,如果您无法更改Frame课程,请更改您的代码:

  const Frame* TryFindFrame(const char* framePath, const Frame* pParentFrame)
  {
    foreach(const Frame* pChildFrame, pParentFrame->ChildFrames)
    {
          if(pChildFrame->HasPath)
          {
            LPCTSTR framePathObj = NULL;
            pChildFrame->GetPath(&framePathObj);
            if(framePathObj != NULL)
            {
              // found it
              if(strcmp(framePathObj, framePath) == 0)  
              {
                return pChildFrame;
              }
              else
              {
                const Frame* pResult = TryFindFrame(framePath, pChildFrame);
                if (pResult)
                  return pResult;
              }
            }
          } 

    }
    return NULL;
  }