C++ 树状结构中的搜索数据

C++ 树状结构中的搜索数据,c++,algorithm,tree,C++,Algorithm,Tree,请推荐有效(快速)的树状结构数据搜索算法,如下所示: struct Node { std::string value; Node* parent; std::vector<Node*> childs; } struct节点 { std::字符串值; 节点*父节点; 性病:病媒儿童; } 目标是找到Node.value与搜索模式匹配的所有节点。 谢谢您一个简单的前序遍历: void match(Node * node, const std::string

请推荐有效(快速)的树状结构数据搜索算法,如下所示:

struct Node
{
    std::string value;

    Node* parent;
    std::vector<Node*> childs;
}
struct节点
{
std::字符串值;
节点*父节点;
性病:病媒儿童;
}
目标是找到Node.value与搜索模式匹配的所有节点。
谢谢您

一个简单的前序遍历:

void match(Node * node, const std::string & value, std::vector<Node*> & result)
{
    if (node->value == value)
    {
        result.push_back(node);
    }
    for (Node * child : node->childs)
    {
        match(child, value, result);
    }
}

int main()
{
    Node * root = /* ... */
    std::string value = /* ... */;
    std::vector<Node*> matches;
    match(root, value, matches);
}
void匹配(节点*节点,常量std::字符串和值,std::向量和结果)
{
如果(节点->值==值)
{
结果。推回(节点);
}
用于(节点*子节点:节点->子节点)
{
匹配(子项、值、结果);
}
}
int main()
{
节点*根=/**/
std::string value=/*…*/;
向量匹配;
匹配(根、值、匹配);
}
这可以概括为

template<typename Action>
void preorder(Node * node, Action action)
{
    action(node);
    for (Node * child : node->childs)
    {
        preorder(child, action);
    }
}

int main()
{
    Node * root = /* ... */
    std::string value = /* ... */;
    std::vector<Node*> matches;
    preorder(root, [&](Node * node){ if (node->value == value) { matches->push_back(node); } });
}
模板
无效预订单(节点*节点,动作)
{
动作(节点);
用于(节点*子节点:节点->子节点)
{
前序(子、动作);
}
}
int main()
{
节点*根=/**/
std::string value=/*…*/;
向量匹配;
前序(根,[&](节点*节点){if(节点->值==值){matches->push_back(节点);}});
}

一个简单的前序遍历:

void match(Node * node, const std::string & value, std::vector<Node*> & result)
{
    if (node->value == value)
    {
        result.push_back(node);
    }
    for (Node * child : node->childs)
    {
        match(child, value, result);
    }
}

int main()
{
    Node * root = /* ... */
    std::string value = /* ... */;
    std::vector<Node*> matches;
    match(root, value, matches);
}
void匹配(节点*节点,常量std::字符串和值,std::向量和结果)
{
如果(节点->值==值)
{
结果。推回(节点);
}
用于(节点*子节点:节点->子节点)
{
匹配(子项、值、结果);
}
}
int main()
{
节点*根=/**/
std::string value=/*…*/;
向量匹配;
匹配(根、值、匹配);
}
这可以概括为

template<typename Action>
void preorder(Node * node, Action action)
{
    action(node);
    for (Node * child : node->childs)
    {
        preorder(child, action);
    }
}

int main()
{
    Node * root = /* ... */
    std::string value = /* ... */;
    std::vector<Node*> matches;
    preorder(root, [&](Node * node){ if (node->value == value) { matches->push_back(node); } });
}
模板
无效预订单(节点*节点,动作)
{
动作(节点);
用于(节点*子节点:节点->子节点)
{
前序(子、动作);
}
}
int main()
{
节点*根=/**/
std::string value=/*…*/;
向量匹配;
前序(根,[&](节点*节点){if(节点->值==值){matches->push_back(节点);}});
}

除非您向我们提供有关搜索模式或树结构的更多信息,否则我认为完全扫描(例如使用DFS)是唯一的方法。您要寻找的是:您可以以排序(可能是平衡)的方式插入节点,以便快速搜索。但是,这将使插入操作更加复杂。假设我在结构中有3个节点,它们的值={'abc','def','xyz'}。我的搜索模式是“e”,只匹配第二个节点。完全扫描肯定不是一个解决方案,除非您向我们提供有关搜索模式或树结构的更多信息,否则我相信完全扫描(例如使用DFS)是唯一的方法。您要找的是a:您可以在已排序的树中插入节点(并且可能是平衡的)方式,以便快速搜索。但是,这将使插入操作更加复杂。假设我在结构中有3个节点,它们的值={'abc','def','xyz'}。我的搜索模式是“e”,只匹配第二个节点。完全扫描肯定不是一个解决方案,如果我没有弄错的话,它是完全扫描遍历。对于我的数据结构庞大的特定任务,它不是最佳的…因为
节点
没有保持任何不变,你不能做得更好。如果你能在数据的总体中添加一些不变的话
节点
那么您就可以better@user478681它可能很慢,但这并不意味着它不是最优的。如果我没有弄错的话,它是全扫描遍历。对于我的数据结构非常庞大的特定任务,它不是最优的…因为
节点
没有保持任何不变量,你不能做得更好。如果你可以添加一些不变量对于
节点的填充
,您可能可以执行以下操作better@user478681它可能很慢,但这并不意味着它不是最优的。