无意间看到以前写的遍历二叉树的C++程序,感觉都忘完了···还是太菜,于是改了改用在遍历DOM树上,借此加深记忆吧。
本文只涉及了层序遍历和前序遍历,层序就是从上到下一层一层往下遍历,每一层从左到右遍历,前序就是根节点->左子树->右子树,一直先把左子树遍历完,在返回右子树。本文的实现主要是通过操纵队列的更新来控制遍历顺序,具体可以看代码注释,代码结构很简单,应该很好理解。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| 层序遍历DOM树, 从上到下按层次访问遍历, 每一层从左到右遍历。 */ function levelOrderDT(obj) { var res = []; var list = [];
function updateList() { for (var i = 0; i < children.length; i++) { list.push(children[i]); } }
var children = obj.children(); updateList();
var temp;
while (list.length > 0) { temp = list[0]; res.push(temp.tagName); list.shift();
if ($(temp).children().length > 0) { children = $(temp).children(); updateList(); } }
return res; }
前序遍历DOM树, 从左子树开始遍历,最后遍历右子树, 在遍历左、右子树时,仍然先遍历左子树,最后遍历右子树。 */ function preOrderDT(obj) { var res = []; var wraper = [];
function updateList() { for (var i = children.length - 1; i >= 0; i--) { wraper.unshift(children[i]); } }
var children = obj.children(); for (var i = 0; i < children.length; i++) { wraper.push(children[i]); }
var temp;
while (wraper.length > 0) { temp = wraper[0]; res.push(temp.tagName); wraper.shift(); if ($(temp).children().length > 0) { children = $(temp).children(); updateList(); } }
return res; }
console.log(levelOrderDT($(document))); console.log(preOrderDT($(document)));
|
此程序在在线编译器上可能会出现一些“不明”标签(在线编译器隐式增加的),建议在本地调试。