我想在树中找到一个节点(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。
当我通过路径找到帧时,如何结束递归?
答案 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;
}