JS对DOM树实现遍历有哪些方法

这次给大家带来JS对DOM树实现遍历有哪些方法,JS对DOM树实现遍历的注意事项有哪些,下面就是实战案例,一起来看一下。

二叉 DOM 树的遍历

function Tree() {   var Node = function(key){      this.key = key;      this.left = null;      this.right = null;   }   root =null;}

登录后复制

前序遍历

首先访问根结点,然后遍历左子树,最后遍历右子树

Tree.prototype.preOrderTraverse = function(callback){  preOrder(root, callback);}var preOrder = function(node,callback){  if(node !== null){    callback(node.key);    preOrder(node.left, callback);    preOrder(node.right, callback);  }}

登录后复制

修改为DOM二叉树:

var preOrder = function(node,callback) {  callback(node);  if(node.firstElementChild) {//先判断子元素节点是否存在     this.preOrder(node.firstElementChild,callback);  }  if(node.lastElementChild) {    this.preOrder(node.lastElementChild,callback);  }};

登录后复制

中序遍历

首先遍历左子树,然后访问根结点,最后遍历右子树。

Tree.prototype.inOrderTraverse = function(callback){  inOrder(root, callback);}var inOrder = function(node,callback){  if(node !== null){    inOrder(node.left,callback);    callback(node.key);    inOrder(node.right, calback);  }}

登录后复制

修改为DOM二叉树:

var inOrder = function(node,callback){  if(node.firstElementChild) {  this.inOrder(node.firstElementChild);  }  callback(node);  if(node.lastElementChild) {  this.inOrder(node.lastElementChild);  }}

登录后复制

后序遍历

首先遍历左子树,然后遍历右子树,最后访问根结点。

Tree.prototype.postOrderTraverse = function(callback){  postOrder(root, callback);}var postOrder = function(node,callback){  if(node !== null){    postOrder(node.left,callback);    postOrder(node.right, calback);    callback(node.key);  }}

登录后复制

修改为DOM二叉树:

var postOrder = function(node,callback){  if(node.firstElementChild) {  this.postOrder(node.firstElementChild);  }  if(node.lastElementChild) {  this.postOrder(node.lastElementChild);  }  callback(node);}

登录后复制

多叉 DOM 树的遍历

广度优先遍历

首先遍历根节点,然后访问第一层节点,第二层节点,….,直到访问到最后一层。

借助于队列,用非递归的方式对多叉树进行遍历

Tree.prototype.BFSearch = function(node,callback){  var queue=[];  while(node!=null){      callback(node);    if(node.children.length!=0){    for (var i=0;i<node.children.length;i++){      queue.push(node.children[i]);//借助于队列,暂存当前节点的所有子节点    }    }      node=queue.shift();//先入先出,借助于数据结构:队列  }};

登录后复制

深度优先遍历

首先遍历根节点,然后沿着一条路径遍历到最深的一层,最后在逐层返回。

借助于栈,实现多叉 DOM树 的深度优先遍历。

Tree.prototype.DFSearch = function(node,callback){    var stack=[];    while(node!=null){    callback(node);    if(node.children.length!=0){    for (var i=node.children.length-1;i>=0;i--){//按照相反的子节点顺序压入栈      stack.push(node.children[i]);//将该节点的所有子节点压入栈    }    }      node = stack.pop();//弹出栈的子节点顺序就是原来的正确顺序(因为栈是先入后出的)  }};

登录后复制

二叉 DOM 树的前序、中序、后序遍历,是深度优先遍历的特例

因此,参考深度优先遍历,借助栈,可以以非递归的方式,实现二叉 DOM 树的  前序、中序和后序遍历

非递归实现二叉 DOM 树的前序遍历

Tree.prototype.preOrder = function(node,callback) {    var stack=[];    while(node!== null || stack.length!=0){      while(node!==null){        stack.push(node);        callback.push(node);        node=node.firstElementChild;      }      node=stack.pop();      node=node.lastElementChild;    }  };

登录后复制

非递归实现二叉 DOM 树的中序遍历

Tree.prototype.inOrder = function(node,callback) {    var stack=[];    while(node!== null || stack.length!=0){      while(node!==null){        stack.push(node);        node=node.firstElementChild;      }      node=stack.pop();      callback(node);      node=node.lastElementChild;    }  };

登录后复制

非递归实现二叉 DOM 树的后序遍历

① 每个节点,都压入栈两次;
② 在循环体中,每次弹出一个节点赋给node
③ 如果node仍然等于栈的头结点,说明node的孩子们还没有被操作过,应该把它的孩子们加入栈中
④ 否则,说明是第二次弹出该节点,访问node。

也就是说,第一次弹出,将node的孩子压入栈中,第二次弹出,访问node

TreeWalker.prototype.postOrder = function(node,callback) {//非递归实现  var stack=[];    stack.push(node);    stack.push(node);  while(stack.length != 0)  {    node = stack.pop();    if(stack.length != 0 && node==stack[stack.length-1])    {      if(node.lastElementChild) stack.push(node.lastElementChild), stack.push(node.lastElementChild);      if(node.firstElementChild) stack.push(node.firstElementChild), stack.push(node.firstElementChild);    }    else        callback(node);  }}

登录后复制

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

怎样操作Angular实现数据请求

如何操作node使用async 控制并发

以上就是JS对DOM树实现遍历有哪些方法的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2753124.html

(0)
上一篇 2025年3月8日 06:33:42
下一篇 2025年3月8日 06:33:50

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • JS中touchstart事件与click事件冲突的解决方法

    这篇文章主要给大家介绍了关于js中touchstart事件与click事件冲突的解决方法,文中通过示例代码将解决的方法介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。 前言 移动互联网是…

    编程技术 2025年3月8日
    200
  • Node.JS循环删除非空文件夹及子目录下的所有文件

    这篇文章主要介绍了node.js循环删除非空文件夹及子目录下的所有文件及node.js递归删除非空文件夹的实例代码,需要的朋友可以参考下 最近要实现一个循环文件夹的功能,文件夹可能不是空的,还可能带有子文件夹和文件,网上找了一些现有的库,但…

    编程技术 2025年3月8日
    200
  • JS跨域实现POST方法步骤详解

    这次给大家带来JS跨域实现POST方法步骤详解,JS跨域实现POST方法的注意事项有哪些,下面就是实战案例,一起来看一下。 javascript 跨域是一个很常见的问题,其中 jsonp 是一个最常用的手段,但是 jsonp 只支持 get…

    编程技术 2025年3月8日
    200
  • Javascript中prototype与__proto__的关系详解

    这篇文章主要给大家介绍了关于javascript中prototype与__proto__的关系的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。 前言 学到原型…

    2025年3月8日
    200
  • js中document.write和document.writeln的区别

    这篇文章主要介绍了js中document.write和document.writeln的区别,需要的朋友可以参考下 两者都是JavaScript向客户端输出的方法,对比可知写法上的差别是一个ln–line的简写,换言之,writ…

    2025年3月8日
    200
  • Javascript 编码约定(编码规范)

    这篇文章主要介绍了javascript 编码约定(编码规范),需要的朋友可以参考下 1、使用 strict 模式 在一个作用域(包括函数作用域、全局作用域)中,可以使用 “use strict”; 来开启 stric…

    编程技术 2025年3月8日
    200
  • HTML文档内嵌入JS方法汇总

    这次给大家带来HTML文档内嵌入JS方法汇总,HTML文档内嵌入JS的注意事项有哪些,下面就是实战案例,一起来看一下。 在HTML里嵌入JavaScript 在HTML文档里嵌入客户端JavaScript代码有4中方法: 1.内嵌,放置在和…

    编程技术 2025年3月8日
    200
  • JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)

    这篇文章主要介绍了javascript获取移动设备型号的实现代码,需要的朋友可以参考下 我们一般在浏览器里识别用户的访问设备都是通过 User Agent 这个字段来获取的,但是通过它我们只能获取一个大概的信息,比如你用的是 Mac 还是 …

    编程技术 2025年3月8日
    200
  • 详解JS常见的BUG和错误处理

    这次给大家带来详解JS常见的BUG和错误处理,详JS常见BUG和错误处理的注意事项有哪些,下面就是实战案例,一起来看一下。 计算机程序中的缺陷通常称为 bug。 它让程序员觉得很好,将它们想象成小事,只是碰巧进入我们的作品。 实际上,当然,…

    编程技术 2025年3月8日
    200
  • js经验分享 JavaScript反调试技巧

    在这篇文章中,我打算跟大家总结一下关于javascript反调试技巧方面的内容。值得一提的是,其中有些方法已经被网络犯罪分子广泛应用到恶意软件之中了,需要的朋友可以参考下 在此之前,我一直都在研究JavaScript相关的反调试技巧。但是当…

    2025年3月8日
    200

发表回复

登录后才能评论