C++逐条路径地在树中找到

C++ find in tree by path

本文关键字:路径 C++      更新时间:2023-10-16

我想在树中找到一个节点(框架对象(。我将路径作为字符串,将根路径(父路径(作为输入参数,这是我的代码:

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

问题是当路径比 "my::test::p ath" 等 2 个元素长时,函数返回 NULL,因为在找到路径后,执行另一个递归并且 pResult 被分配为 NULL。

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

你的代码是如何编译的有点奇怪,因为你在返回时隐式地将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;
  }