dom结点的深度优先遍历和广度优先搜索

本文介绍DOM树的深度优先和广度优先遍历算法,包括递归与非递归实现方式。深度优先遍历通过栈结构实现,而广度优先则采用队列结构。这些算法在前端开发中用于操作和检索DOM元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*深度优先递归实现*/

参数node表示dom节点,

比如var domEle=document.getElementsByTagName("html")[0];

deepTraversal(domEle);

var nodes=[];//nodes必须放在函数外面
function deepTraversal(node) 
{ if(node!=null){ 
  nodes.push(node); 
  var children=node.children; 
  for(var i=0;i<children.length;i++){ d
     eepTraversal(children[i]); 
  } 
} return nodes;}

/*深度优先非递归实现*/

var nodes=[];
function deepTraversal(node) { 
  if(node!=null){ 
    var stack==[]; 
    stack.push(node); 
    while(stack.length!=0){
      var item=stack.pop(); 
      nodes.push(item); 
      var children=item.children; 
      for(var i=children.length-1;i>=0;i--){ 
         stack.push(children[i]); 
      } 
    } 
   }
}

/*广度优先递归实现*/

//遍历结果
function wideTraversal(node) {
      var nodes=[] ; //nodes可放函数中
      var i = 0;
      if (!(node == null)) {
        nodes.push(node);
        wideTraversal(node.nextElementSibling);
        node = nodes[i++];
        wideTraversal(node.firstElementChild);
      }
      return nodes;
  }

/*广度优先非递归实现*/
var nodes =[] ;
	function wideTraversal(selectNode) { 
          if (selectNode != null) { 
            var queue=[]; queue.unshift(selectNode);//在数组的前端添加项 
             while (queue.length != 0) { var item = queue.shift();//移除数组中的第一项,并返回该项 
               nodes.push(item);//向数组末端添加项 
               var children = item.children; 
               for (var i = 0; i < children.length; i++) 
                   queue.push(children[i]); 
               } 
             }
             return nodes; 
        }	
### 文本标签树的概念 文本标签树是一种层次化的数据结构,通常用于表示具有父子关系的文本片段。这种结构不仅有助于更好地组织管理文本内容,还能够在自然语言处理任务中提供更丰富的上下文信息。通过构建文本标签树,可以有效地解析复杂文档结构并支持多种应用场景。 #### 数据结构设计 为了实现文本标签树,建议采用如下数据结构: - **节点类定义** 每个节点代表一个具体的文本单元或者标记,包含以下属性: - `id`: 唯一标识符 - `content`: 节点内的纯文本内容 - `tag_name`: HTML或其他格式下的标签名称(如`<p>`、`<div>`) - `children`: 子节点列表 ```python class TreeNode: def __init__(self, id_, content="", tag_name=None): self.id = id_ self.content = content self.tag_name = tag_name self.children = [] ``` - **树形结构** 整体上形成一棵或多棵树的形式来表达整个文档的内容及其内部逻辑关联。根节点通常是最高级别的容器元素,而叶子节点则对应于最底层的具体文字描述部分[^1]。 #### 构建与遍历算法 当创建好基本的数据模型之后,还需要考虑如何高效地填充这些对象实例以及对其进行操作。这里介绍两种常见的方式——自顶向下法自底向上法。 - 自顶向下的方法适合已知整体框架的情况;先初始化根结点再逐步添加子级直至完成整棵树木。 - 自底向上的策略适用于流式输入场景,在接收到新的记录时动态调整现有体系的位置安排。 对于已经形成的标签树来说,可以通过深度优先搜索(DFS)或广度优先搜索(BFS)来进行遍历查询特定条件满足的所有项。 ```python def dfs(node, callback): stack = [node] while stack: current_node = stack.pop() callback(current_node) for child in reversed(current_node.children): stack.append(child) def bfs(root, callback): queue = deque([root]) while queue: node = queue.popleft() callback(node) queue.extend(node.children) ``` #### 应用案例 文本标签树广泛应用于网页抓取后的DOM重建、XML/JSON文件解析等领域。特别是在多层级展示需求强烈的地方,比如论坛帖子回复链路可视化、书籍章节导航栏生成等场合下显得尤为重要[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值