摘要:一数据模型二递归实现递归实现三非递归广度优先实现先将第一层节点放入栈如果该节点有子节点,继续添加进入栈底非递归广度优先实现四非递归深度优先实现先将第一层节点放入栈如果该节点有子节点,继续添加进入栈顶非递归深度优先实现
文章来源:http://www.html-js.com/articl...
简单的遍历一个树形结构数据的几种方法、非递归方法效率最好。
一:数据模型:</>复制代码
(function (window, undefined) {
var treeNodes = [
{
id: 1,
name: "1",
children: [
{
id: 11,
name: "11",
children: [
{
id: 111,
name: "111",
children:[]
},
{
id: 112,
name: "112"
}
]
},
{
id: 12,
name: "12",
children: []
}
],
users: []
},
{
id: 2,
name: "2",
children: [
{
id: 22,
name: "22",
children: []
}
]
}
];
二:递归实现
</>复制代码
var parseTreeJson = function(treeNodes){
if (!treeNodes || !treeNodes.length) return;
for (var i = 0, len = treeNodes.length; i < len; i++) {
var childs = treeNodes[i].children;
console.log(treeNodes[i].id);
if(childs && childs.length > 0){
parseTreeJson(childs);
}
}
};
console.log("------------- 递归实现 ------------------");
parseTreeJson(treeNodes);
三:非递归广度优先实现
</>复制代码
var iterator1 = function (treeNodes) {
if (!treeNodes || !treeNodes.length) return;
var stack = [];
//先将第一层节点放入栈
for (var i = 0, len = treeNodes.length; i < len; i++) {
stack.push(treeNodes[i]);
}
var item;
while (stack.length) {
item = stack.shift();
console.log(item.id);
//如果该节点有子节点,继续添加进入栈底
if (item.children && item.children.length) {
//len = item.children.length;
// for (i = 0; i < len; i++) {
// stack.push(item.children[i]);
// }
stack = stack.concat(item.children);
}
}
};
console.log("------------- 非递归广度优先实现 ------------------");
iterator1(treeNodes);
四:非递归深度优先实现
</>复制代码
var iterator2 = function (treeNodes) {
if (!treeNodes || !treeNodes.length) return;
var stack = [];
//先将第一层节点放入栈
for (var i = 0, len = treeNodes.length; i < len; i++) {
stack.push(treeNodes[i]);
}
var item;
while (stack.length) {
item = stack.shift();
console.log(item.id);
//如果该节点有子节点,继续添加进入栈顶
if (item.children && item.children.length) {
// len = item.children.length;
// for (; len; len--) {
// stack.unshift(item.children[len - 1]);
// }
stack = item.children.concat(stack);
}
}
};
console.log("------------- 非递归深度优先实现 ------------------");
iterator2(treeNodes);
})(window);
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/82360.html
摘要:算法之深度优先遍历和广度优先遍历背景在开发页面的时候,我们有时候会遇到这种需求在页面某个节点中遍历,找到目标节点,我们正常做法是利用选择器,或者,但在本文,我们从算法的角度去查找节点,同时理解一下深度优先遍历和广度优先遍历的原理。 JS算法之深度优先遍历(DFS)和广度优先遍历(BFS) 背景 在开发页面的时候,我们有时候会遇到这种需求:在页面某个dom节点中遍历,找到目标dom节点,...
摘要:树中结点的最大层次称为树的深度或高度。二叉树有深度遍历和广度遍历,深度遍历有前序中序和后序三种遍历方法。二叉树的前序遍历可以用来显示目录结构等中序遍历可以实现表达式树,在编译器底层很有用后序遍历可以用来实现计算目录内的文件及其信息等。 树的简介 栈、队列、链表等数据结构,都是顺序数据结构。而树是非顺序数据结构。树型结构是一类非常重要的非线性结构。直观地,树型结构是以分支关系定义的层次结...
摘要:先画个树,然后解释何为深度,何为广度第一层子集第二层子集第二层子集第三层,子集第三层第四层图就不画太复杂了,最高四层的结构,如果换成的形式的话可以理解成第一层第二层 先画个树,然后解释 何为深度, 何为广度 第一层 子集 | ...
阅读 3545·2019-08-30 15:55
阅读 2125·2019-08-30 15:44
阅读 1582·2019-08-30 12:47
阅读 818·2019-08-30 11:05
阅读 1687·2019-08-30 10:54
阅读 719·2019-08-29 16:07
阅读 3651·2019-08-29 14:17
阅读 2307·2019-08-23 18:31