树的某节点的所有父节点

http://blog.youkuaiyun.com/yhmhappy2006/article/details/1566865

定位一个节点递归实现为:
node FindNode(const node root,int val)
{
       node n = root;
       if (NULL == n)
              return NULL;
 
       if (n->_value == val)
              return n;
 
       node p = FindNode(n->_lchild,val);
       if (NULL == p)
              return FindNode(n->_rchild,val);
       else
              return p;
}

输出到当前节点的所有路径,也就是当前节点的所有父亲节点集合(这个很有用的,呵呵,知道的人自然知道:))。这个实现其实是根据中序遍历得到的,采用中序遍历的方式查找节点,当查找到当前节点的时候堆栈中保存的就是当前节点以及当前节点的所有父亲节点。实现代码为:


int* GetParent(const node root,int val)
{
       assert(NULL != root);
       if (root->_value == val)
       {
              cout<<"found: "<<root->_value<<endl;
              int* prt = new int(root->_value);
              return prt;
       }
 
       stack<node> tree;
       node n = root;
       node tmp = NULL;
 
       while ((!tree.empty()) || (NULL != root))
       {
              while (n != NULL)
              {
                     tree.push(n);
                     n = n->_lchild;
              }
 
              if (!tree.empty())
              {
                     int len = tree.size();
                     int* prt = new int[len];
                     int i = 0;
 
                     tmp = tree.top();
                     if (tmp->_value == val)
                     {
                            while (tree.size() > 0)
                            {
                                   prt[i++] = tree.top()->_value;
                                   cout<<tree.top()->_value<<"->";
                                   tree.pop();
                            }
                            cout<<endl;
 
                            return prt;
                     }
                     else
                            n = n->_rchild;
              }
       }
 
       return NULL;
}





### 修改子节点时自动更新父节点样式的实现方法 为了实现在形表格中修改子节点时自动更新父节点的样式,可以考虑以下方案: #### 1. 数据结构设计 确保形数据结构中的每个节点不仅包含自身的属性,还应记录其父子关系。通常情况下,可以通过 `id` 和 `parentId` 字段来表示这种层次关系。 #### 2. 更新机制 当检测到某个子节点发生变更时,通过遍历算法找到对应的父级节点并应用新的样式规则。具体来说,在前端框架下可利用事件监听器捕获变化事件;而在数据库层面,则可以在执行 UPDATE 操作之后触发相应的逻辑处理程序来进行关联字段或视图刷新操作[^3]。 #### 3. 实现示例 (基于JavaScript) 假设有一个简单的 HTML 页面展示了一个具有嵌套特性的列表项作为状结构,并且希望在点击任意一项改变状态的同时也影响它所属分类下的根目录显示效果: ```html <ul id="tree"> <!-- 样本项目 --> </ul> <script type="text/javascript"> document.addEventListener('DOMContentLoaded', function () { const treeElement = document.getElementById('tree'); //模拟的数据集 let data=[ {name:'A',children:[{name:'AA'},{name:'AB'}]}, {name:'B'} ]; renderTree(data); function toggleItem(event){ event.target.classList.toggle('active'); //获取当前元素对应对象及其上级容器 var item=event.target; while((item=item.parentElement)!=null&&item.tagName!=='LI'){ continue; } if(!item)return; //查找最近的一个祖先 LI 元素即为目标父节点 do{ item=item.closest('li'); if(item!==null && !event.target.isSameNode(item)){ item.style.backgroundColor='lightblue';//设置新背景颜色 } }while(item!=null); }; function renderTree(nodes,parent=null){ nodes.forEach(node=>{ let li=document.createElement('li'); li.textContent=node.name; li.onclick=toggleItem; if(Array.isArray(node.children)&&node.children.length>0){ let ul=document.createElement('ul'); renderTree(node.children,ul); li.appendChild(ul); } if(parent===null){ treeElement.appendChild(li); }else{ parent.appendChild(li); } }); }; }); </script> ``` 此代码片段展示了如何创建一个基本的交互式形菜单,并定义了单击某一分支会将其自身以及所有上层分组标记为激活状态的方法。每当用户选中某一特定条目时,该函数就会被调用以更改相关联的视觉表现形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值