UIHelper的两个自动递归获取节点的函数(返回Node *)

//by tag

Node* seekNodeByTag(Node* root, int tag){ 

    if (!root) 
    { 
        return nullptr; 
    } 
    if (root->getTag() == tag) 
    { 
        return root; 
    } 
    const auto& arrayRootChildren = root->getChildren(); 
    ssize_t length = arrayRootChildren.size(); 
    for (ssize_t i=0;i<length;i++) 
    { 
        Node* child = dynamic_cast<Node*>(arrayRootChildren.at(i)); 
        if (child) 
        { 
            Node* res = seekNodeByTag(child,tag); 
            if (res != nullptr) 
            { 
                return res; 
            } 
        } 
    } 
    return nullptr; 

} 

//by name

Node* seekNodeByName(Node* root, const std::string& name) 
{ 
    if (!root) 
    { 
        return nullptr; 
    } 
    if (root->getName() == name) 
    { 
        return root; 
    } 
    const auto& arrayRootChildren = root->getChildren(); 
    for (auto& subWidget : arrayRootChildren) 
    { 
        Node* child = dynamic_cast<Node*>(subWidget); 
        if (child) 
        { 
            Node* res = seekNodeByName(child,name); 
            if (res != nullptr) 
            { 
                return res; 
            } 
        } 
    } 
    return nullptr; 
} 

//广度优先+递归消除算法:

Node * Helper::seekNodeByName_WF(Node *root,const std::string &name) 

   if(!root || root->getName() == name) 
      return root; 
 
   auto vecChildren = &root->getChildren(); 
   std::vector<decltype(vecChildren)>vec; 
   vec.push_back(vecChildren); 
   size_t index = 0; 
   do  
   { 
      vecChildren = vec[index]; 
      for(auto node : *vecChildren) 
      { 
            if(node->getName() == name) 
            { 
               return node; 
            } 
            vec.push_back(&node->getChildren()); 
        } 
       ++index; 
    } while (index != vec.size()); 
 
return nullptr; 


Node * Helper::seekNodeByTag_WF(Node *root,int tag) 

    if(!root || root->getTag() == tag) 
        return root; 
 
    auto vecChildren = &root->getChildren(); 
    std::vector<decltype(vecChildren)>vec; 
    vec.push_back(vecChildren); 
    size_t index = 0; 
    do  
    { 
       vecChildren = vec[index]; 
        for(auto node : *vecChildren) 
        { 
            if(node->getTag() == tag) 
            { 
                return node; 
            } 
            vec.push_back(&node->getChildren()); 
        } 
        ++index; 
    } while (index != vec.size()); 
 
    return nullptr; 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lin&Yi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值